问题是,您的 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);
}
}