【问题标题】:Getting a PropertyInfo.Name from a FieldInfo object从 FieldInfo 对象获取 PropertyInfo.Name
【发布时间】:2018-11-27 12:09:19
【问题描述】:

我有一个使用一些 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 对象吗?

【问题讨论】:

    标签: c# reflection xamarin.forms propertyinfo fieldinfo


    【解决方案1】:

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

        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

    【讨论】:

    • 遗憾的是,我必须需要 FieldInfo,所以我无法更改该方法(因为我需要在运行时设置字段的值),除非你能告诉我一种设置属性值的方法使用 PropertyInfo 的对象。实际上,我已经使用了与您的 GetInfo 完全相同的函数,我将使用更多代码来增加我的问题,以便您了解案例。
    【解决方案2】:

    我绕过它:

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多