簡體   English   中英

從FieldInfo對象獲取PropertyInfo.Name

[英]Getting a PropertyInfo.Name from a FieldInfo object

我有一個使用一些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查詢,該查詢將發送到Web服務,更具體地說。 但是FieldInfo.Name對象通常類似於k__BackingField或k__BackingField,我需要PropertyInfo.Name,這是正確的名稱。 有什么方法可以從FieldInfo對象創建PropertyInfo對象?

我在舊代碼中得到了這個。

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

您可以使用PropertyInfo

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

如果您想讓所有T成員

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

MemberInfo https://docs.microsoft.com/zh-cn/dotnet/api/system.reflection.memberinfo?view=netframework-4.7.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的可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM