c# - 从类方法中获取属性名称
问题描述
有没有办法在 GetPKs 方法中获取属性的名称?也许使用反射?
所以在下面的示例中,我需要以某种方式获取一个返回“Id”、“Id2”的对象 []。Id3 将被忽略。我不需要值,但需要 Id 名称
public class MyClass
{
public int Id;
public int Id2;
public int Id3;
public object[] GetPKs() => new object[] { Id, Id2 };
}
解决方案
问题是,你的Id
和Id2
只是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);
}
}
推荐阅读
- websphere - 如何将现有证书的 RSA 密钥长度从 1024 增加到 2048?
- amazon-ec2 - NOQUEUE:拒绝:在 AWS ubuntu 上拒绝 RCPT 中继访问
- r - R ggplot2 无法将图例添加到图形
- python - 子图标题与图的主标题位于同一位置
- c - 为什么使用 char 指针数组会出现分段错误?
- javascript - Angular 6.0.5 - 无法访问那里的属性
- python - 在 python 中显示 termcolor.colored
- python - 从 TensorFlow 图中提取权重以在 Keras 中使用它们
- c++ - QTcpSocket 指针在视图中产生 SIGSEGV。(QT5)
- javascript - React 和 NextJS:我如何检测客户的位置?