繁体   English   中英

如何检查继承的属性是否是类(子类)的一部分

[英]How to check if inherited property is the part of class (sub-class)

我正在尝试创建一个通用函数,该函数可以通过查看MemberExpressionMember并在Type找到它来判断该属性是否存在于该类中。 它适用于普通属性,但对于继承的属性,它找不到它们。

class Person {
    public string FirstName {get;set;}
    public string LastName {get;set;}       
}

class Student : Person {
    public string StudentID {get;set;}
}

public static void Main()
{
    bool test1 = IsPropertyPartOfClass<Student, string>(x => x.StudentID);
    Console.WriteLine("Testing StudentID property");
    if (test1)
        Console.WriteLine("\tProperty is part of Class");
    else
        Console.WriteLine("\tProperty is not part of Class");

    bool test2 = IsPropertyPartOfClass<Student, string>(x => x.FirstName);
    Console.WriteLine("Testing FirstName property");
    if (test2)
        Console.WriteLine("\tProperty is part of Class");
    else
        Console.WriteLine("\tProperty is not part of Class");
}

public static bool IsPropertyPartOfClass<T, R>(Expression<Func<T, R>> expPropSel){
    MemberInfo mem_info_from_exp = ((MemberExpression)((LambdaExpression)expPropSel).Body).Member;
    return typeof(T).GetProperties().Where(x=> x == mem_info_from_exp).Any();
}

输出:

Testing StudentID property
    Property is part of Class
Testing FirstName property
    Property is not part of Class

更新:

在@NetMage 的帮助下,我能够修改我的方法。 请注意,我的方法现在还涵盖了表达式可能属于不同子类而T参数可能代表不同子类的情况。

var employeeObj = new Employee(); // here Employee is also inherited from Person class
trickyTest = IsPropertyPartOfClass<Student, string>(x => employeeObj.FirstName);

在上面的例子中,我们希望函数返回false

public static bool IsPropertyPartOfClass<T, R>(Expression<Func<T, R>> expPropSel) {
    MemberInfo mem_info_from_exp = ((MemberExpression)((LambdaExpression)expPropSel).Body).Member;
    Type sourceType = ((MemberExpression)((LambdaExpression)expPropSel).Body).Expression.Type;
    return typeof(T)
                .GetProperties()
                .Where(x=> 
                            sourceType == typeof(T) &&
                            (
                                (x == mem_info_from_exp) || 
                                (
                                    x.Name == mem_info_from_exp.Name &&
                                    x.Module.Equals(mem_info_from_exp.Module) && 
                                    x.MetadataToken == mem_info_from_exp.MetadataToken
                                )
                            )
                )
                .Any();
}

ReflectedType是之间是不同MemberInfo从拉姆达和PropertyInfo ■从类型-也许你应该使用HasSameMetadataDefinitionAs

请参阅此处的讨论以了解添加它的原因。

可能 IsPropertyPartOfClass 方法也可以检查基本属性

public static bool IsPropertyPartOfClass<T, R>(Expression<Func<T, R>> 
  expPropSel)
{
     MemberInfo memInfoFromExp = ((MemberExpression) expPropSel.Body).Member;
     var memberInfo = typeof(T).BaseType;
     return typeof(T).GetProperties().Any(x => x == memInfoFromExp || 
         memberInfo != null && memberInfo.GetProperties().Any(x => x == 
         memInfoFromExp));
}

暂无
暂无

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

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