简体   繁体   English

将 FieldInfo 转换为 PropertyInfo,反之亦然

[英]Convert FieldInfo to PropertyInfo or vice versa

I have a class with Component target , string propertyName , FieldInfo mFieldInfo and PropertyInfo mPropertyInfo , where mPropertyInfo = target.GetType().GetProperty(property);我有一个 class 与Component targetstring propertyNameFieldInfo mFieldInfoPropertyInfo mPropertyInfo ,其中mPropertyInfo = target.GetType().GetProperty(property); and mFieldInfo = target.GetType().GetField(property);mFieldInfo = target.GetType().GetField(property); and i use one of these variables, which not null.我使用其中一个变量,而不是 null。 And i want to use only one variable mProperty , which can be setted by PropertyInfo OR FieldInfo.我只想使用一个变量mProperty ,它可以由 PropertyInfoFieldInfo 设置。 I can't use properties everywhere because my code gets properties and fields also from not my classes.我不能到处使用属性,因为我的代码也不是从我的类中获取属性和字段。

I use these extensions to get either:我使用这些扩展来获得:

public static List<MemberInfo> GetPropertiesOrFields(this Type t, BindingFlags bf = BindingFlags.Public | BindingFlags.Instance) =>
    t.GetMembers(bf).Where(mi => mi.MemberType == MemberTypes.Field || mi.MemberType == MemberTypes.Property).ToList();

public static List<string> GetPropertyOrFieldNames(this Type t) => t.GetPropertiesOrFields().Select(mi => mi.Name).ToList();

public static MemberInfo GetPropertyOrField(this Type t, string memberName, BindingFlags bf = BindingFlags.Public | BindingFlags.Instance) =>
    t.GetMember(memberName, bf).Where(mi => mi.MemberType == MemberTypes.Field || mi.MemberType == MemberTypes.Property).Single();

Then use these methods to manipulate the MemberInfo s:然后使用这些方法来操作MemberInfo

// ***
// *** MemberInfo Extensions
// ***
public static Type GetMemberType(this MemberInfo member) {
    switch (member) {
        case FieldInfo mfi:
            return mfi.FieldType;
        case PropertyInfo mpi:
            return mpi.PropertyType;
        case EventInfo mei:
            return mei.EventHandlerType;
        default:
            throw new ArgumentException("MemberInfo must be if type FieldInfo, PropertyInfo or EventInfo", nameof(member));
    }
}

public static bool GetCanWrite(this MemberInfo member) {
    switch (member) {
        case FieldInfo mfi:
            return true;
        case PropertyInfo mpi:
            return mpi.CanWrite;
        default:
            throw new ArgumentException("MemberInfo must be if type FieldInfo or PropertyInfo", nameof(member));
    }
}

public static object GetValue(this MemberInfo member, object srcObject) {
    switch (member) {
        case FieldInfo mfi:
            return mfi.GetValue(srcObject);
        case PropertyInfo mpi:
            return mpi.GetValue(srcObject);
        case MethodInfo mi:
            return mi.Invoke(srcObject, null);
        default:
            throw new ArgumentException("MemberInfo must be of type FieldInfo, PropertyInfo or MethodInfo", nameof(member));
    }
}
public static T GetValue<T>(this MemberInfo member, object srcObject) => (T)member.GetValue(srcObject);

public static void SetValue(this MemberInfo member, object destObject, object value) {
    switch (member) {
        case FieldInfo mfi:
            mfi.SetValue(destObject, value);
            break;
        case PropertyInfo mpi:
            mpi.SetValue(destObject, value);
            break;
        case MethodInfo mi:
            mi.Invoke(destObject, new object[] { value });
            break;
        default:
            throw new ArgumentException("MemberInfo must be of type FieldInfo, PropertyInfo or MethodInfo", nameof(member));
    }
}
public static void SetValue<T>(this MemberInfo member, object destObject, T value) => member.SetValue(destObject, (object)value);

You can create property with the base type of both of them:您可以使用它们的基本类型创建属性:

MemberInfo mProperty { get; set; }

and then assign:然后分配:

mProperty = target.GetType().GetProperty(property);

and also:并且:

mProperty = target.GetType().GetField(property);

See also:也可以看看:

https://docs.microsoft.com/en-us/dotnet/api/system.reflection.memberinfo?view=netcore-3.1#properties https://docs.microsoft.com/en-us/dotnet/api/system.reflection.memberinfo?view=netcore-3.1#properties

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM