【问题标题】:Get property names from class method从类方法中获取属性名称
【发布时间】:2019-06-28 07:17:52
【问题描述】:

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

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

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

【问题讨论】:

  • 能否请您发布更多上下文代码。 IdId2 声明在哪里?
  • 你必须反编译代码。不是微不足道的,为什么您需要知道为该数组提供值的 事物 的名称?
  • 是的,我需要变量的名称:在这种情况下是 Id 和 Id2
  • 这听起来有点像 X/Y 问题。这些值如何以及为什么会出现在这个数组中,为什么需要这些名称?你的目标是什么

标签: c# .net reflection


【解决方案1】:

问题是,您的 Id,Id2Id3 只是整数值,所以如果 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);
     }
}

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 2012-01-08
    • 2014-10-27
    • 2011-02-15
    • 2010-09-14
    • 2016-02-03
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多