从类方法获取属性名称

时间:2019-06-28 07:17:52

标签: c# .net reflection

有没有一种方法可以获取GetPKs方法中的属性名称?也许使用反射?

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

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

2 个答案:

答案 0 :(得分:0)

首先,Id和Id2不是属性。它们是object []数组中的对象实例。如果在MyClass中声明了Id和Id2,则可以使用反射访问它们的属性名称。


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

    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();

            foreach (var item in myClass.GetType().GetProperties())
            {
                Console.WriteLine(item.Name);
            }

            Console.Read();
        }
    }

答案 1 :(得分:0)

问题是,您的IdId2Id3只是整数值,因此如果Id2==Id3您不知道要打印什么, Id2Id3 如果我们假设,则您所有的属性都不同,则可以这样:

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);
     }
}