0

我有一个使用一些 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;
            }

现在我需要某种方法从该函数返回的特定 FieldInfo 获取 PropertyInfo 对象,主要是因为我特别需要 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,这是正确的名称。有什么方法可以从 FieldInfo 对象创建 PropertyInfo 对象吗?

4

2 回答 2

0

我绕过它:

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 的可能性。

于 2018-11-27T13:42:16.743 回答
0

我在我的旧代码中得到了这个。

    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();

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

于 2018-11-27T12:17:24.553 回答