Проблема в том, что ваши 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);
}
}