首页 > 解决方案 > 从类方法中获取属性名称

问题描述

有没有办法在 GetPKs 方法中获取属性的名称?也许使用反射?

所以在下面的示例中,我需要以某种方式获取一个返回“Id”、“Id2”的对象 []。Id3 将被忽略。我不需要值,但需要 Id 名称

public class MyClass
{ 
     public int Id; 
     public int Id2;
     public int Id3;
     public object[] GetPKs() => new object[] { Id, Id2 };
 }

标签: c#.netreflection

解决方案


问题是,你的IdId2只是Id3整数值,所以如果Id2==Id3你不知道你必须打印什么,Id2或者Id3 如果我们假设你的所有属性都不同,你可以这样:

public class MyClass
{ 
     public int Id; 
     public int Id2;
     public int Id3;
     public object[] GetPKs() => new object[] { Id, Id2 };
     public IEnumerable<string> GetPNames() 
     {
        var allProperties = GetType().GetProperties().Select(x=>new {x.Name, Value = x.GetValue(this)});
        var allFields = GetType().GetFields().Select(x=>new {x.Name, Value = x.GetValue(this)});
        var dict = allProperties.Concat(allFields).ToDictionary(x=>x.Value, x=>x.Name);
        foreach(var value in GetPKs())
        {
            yield return dict[value];
        }
     }
}

该代码迭代字段和属性。如果你只有字段,你可以简化它:

public class MyClass
{ 
     public int Id; 
     public int Id2;
     public int Id3;
     public object[] GetPKs() => new object[] { Id, Id2 };
     public IEnumerable<string> GetPNames() 
     {          
        var allFields = GetType().GetFields()
                                 .Select(x=>new {x.Name, Value = x.GetValue(this)});
        var dict = allFields.ToDictionary(x=>x.Value, x=>x.Name);
        foreach(var value in GetPKs())
        {
            yield return dict[value];
        }
     }
}

也许更好的方法不是存储对象,而是存储表达式,指向您的字段。在这种情况下,您可以从表达式中提取字段名称,无论它们具有什么值。

public class MyClass
{ 
     public int Id; 
     public int Id2;
     public int Id3;
     public Expression<Func<MyClass,object>>[] GetPKs() 
                       => new Expression<Func<MyClass,object>>[] { x=>Id, x=>Id2 };
     public IEnumerable<string> GetPNames()
     {
        return GetPKs().Select(expr =>
              ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.Name);
     }
}

推荐阅读