1

有没有办法(在 c# .Net 4.0 中)以强类型方式提供对象属性名称?例如,如果我们有一个对象 Person

Public class Person{
    public string Name { get; set; }
    public int Age { get; set; }
    }

我想将参数名称、年龄属性名称发送到其他方法,但不是字符串,而是强类型:

SomeMethodThatWantToKnowKeys(Person.Name,Person.Age);

我想要实现的是,如果有人更改属性名称,他将不得不更改他发送到“SomeMethodThatWantToKnowKeys”的属性名称。也许是反思?更好的方法是不更新对象 itsef 或创建它的实例。

4

2 回答 2

3

好吧,虽然有一些丑陋的黑客,但有一个更好、更清晰的解决方案。这个问题是因为抽象不到位。

什么是名字?一个字符串?它可能是一个 int、double、char、float ......任何东西......你并不真正关心底层类型。您关心名称的概念或概念。我知道这有点深,但是这种经验将帮助您进行良好的设计。

这是我现在的建议,但我个人可能会做更多。

public class PersonName
{
    public String Name { get; set; }
}

public class PersonAge
{
    public int Age {get;set;}
}

public class Person
{ 
    public PersonName PersonName {get;set;}
    public PersonAge PersonAge {get;set;}
}

所以现在你的方法签名是:

    SomeMethodThatWantToKnowKeys(PersonName,PersonAge);

类型安全是一件了不起的事情!

于 2013-11-13T23:22:57.577 回答
3

如果我明白你想要什么,你可以使用表达式

void SomeMethod<T>(Expression<Func<T>> expr)
{
    var memberExpr = expr.Body as MemberExpression;
    Console.WriteLine("{0}: {1}", memberExpr.Member.Name, expr.Compile()());
}

var person = new { Name = "John Doe", Age = 10 };
SomeMethod(() => person.Name); // prints "Name: John Doe"
SomeMethod(() => person.Age);  // prints "Age: 10"
于 2013-11-13T23:01:27.277 回答