Получение PropertyInfo.Name из объекта FieldInfo

У меня есть метод, который использует некоторые объекты FieldInfo:

public static T SetFieldValue<T>(this T src, string propName, object value)
            {
                Type type = typeof(T);
                FieldInfo propInfo = type.GetField(propName, 
                    BindingFlags.Instance | BindingFlags.NonPublic);
                Type propType = propInfo.FieldType;
                var targetType = IsNullableType(propType) 
                    ? Nullable.GetUnderlyingType(propType) : propType;
                value = Convert.ChangeType(value, targetType);
                propInfo.SetValue(src, value);
                return src;
            }

Теперь мне нужен какой-то способ получить объект PropertyInfo из определенного поля FieldInfo, которое возвращает эта функция, в основном потому, что мне конкретно нужна строка PropertyInfo.Name, какие-нибудь мысли по этому поводу?

Изменить: вот более конкретный код, я использую этот метод, чтобы получить разницу между двумя объектами:

public static List<Variance> DetailedCompare<T>(this T val1, T val2)
        {
            List<Variance> variances = new List<Variance>();
            FieldInfo[] fi = typeof(T).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
            foreach (FieldInfo f in fi) {
                Variance v = new Variance();
                v.Prop = f.Name;
                v.valA = f.GetValue(val1);
                v.valB = f.GetValue(val2);
                if (v.valA != null) {
                    if (!v.valA.Equals(v.valB))
                        variances.Add(v);
                } else if (v.valB != null) {
                    variances.Add(v);
                }
            }
            return variances;
        }

Затем я использую возвращенные поля для форматирования SQL-запроса, который я отправлю в веб-службу, если быть более точным. Но объекты FieldInfo.Name обычно представляют собой что-то вроде k__BackingField или k__BackingField. Мне нужно PropertyInfo.Name, которое является правильным именем. Есть ли способ создать объект PropertyInfo из объекта FieldInfo?


person Theodor3gabriel    schedule 27.11.2018    source источник


Ответы (2)


я получил это в своих старых кодах.

    private static PropertyInfo GetInfo(object myObject, string name)
    {
        return myObject.GetType().GetProperty(name);
    }

вы можете использовать PropertyInfo

msdn https://docs.microsoft.com/en-us/dotnet/api/system.reflection.propertyinfo?view=netframework-4.7.2

и если вы хотите получить всех участников в T

            Type type = typeof(T);
            MemberInfo[] tempInfo = type.GetMembers();

MemberInfo https://docs.microsoft.com/en-us/dotnet/api/system.reflection.memberinfo?view=netframework-4.7.2

person Seungbin Yang    schedule 27.11.2018
comment
К сожалению, мне обязательно нужен FieldInfo, поэтому я не могу изменить этот метод (потому что мне нужно установить значения в полях во время выполнения), если вы не можете показать мне способ установить значение свойства объекта с помощью PropertyInfo. На самом деле я уже использую функцию, точно такую ​​​​же, как ваша GetInfo, я увеличу свой вопрос дополнительным кодом, чтобы вы могли понять дело. - person Theodor3gabriel; 27.11.2018

Я обошёл его стороной:

public static List<Variance> DetailedCompare<T>(this T val1, T val2, bool pName = false)
        {
            List<Variance> variances = new List<Variance>();
            FieldInfo[] fi = typeof(T).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
            foreach (FieldInfo f in fi) {
                Variance v = new Variance();
                PropertyInfo prop = default(PropertyInfo);
                if (pName) {
                    prop = typeof(T).GetProperties().Where(p => f.Name.Contains(p.Name)).FirstOrDefault();
                }
                v.Prop = pName ? (prop != default(PropertyInfo) ? prop.Name : "") : f.Name;
                v.valA = f.GetValue(val1);
                v.valB = f.GetValue(val2);
                if (v.valA != null) {
                    if (!v.valA.Equals(v.valB))
                        variances.Add(v);
                } else if (v.valB != null) {
                    variances.Add(v);
                }
            }
            return variances;
        }

Что я сделал, так это дал возможность этому методу возвращать PropertyInfo.Name.

person Theodor3gabriel    schedule 27.11.2018