有没有一种方法可以获取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 };
}
答案 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)
问题是,您的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);
}
}