【问题标题】:Using obect's property names in strongly type way以强类型方式使用 obect 的属性名称
【发布时间】:2013-11-13 22:53:24
【问题描述】:

有没有办法(在 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 或创建它的实例。

【问题讨论】:

  • 请更具体并完善您的问题,很难理解您所追求的。
  • 当您决定现在发送名字而不是姓名时,您是说想让Method(string name) 变成Method(string firstname)
  • 是的,有办法做到这一点。搜索“强类型 INotifyPropertyChanged”或类似内容以查看该技术。​​
  • 顺便说一下,这是string Name,而不是Name string
  • 看看我的一个问题是否有帮助:stackoverflow.com/questions/16154172/… ... 这让我可以传入 () => p.Name。

标签: c# .net reflection


【解决方案1】:

如果我明白你想要什么,你可以使用expressions:

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"

【讨论】:

  • 我在很多方面都看到过这个问题,所以我把它封装在一个问答帖子中,在这里 - stackoverflow.com/questions/32310767/… 另外,我已经将你的答案用于“GetPropertyName”并给予信任给你..
【解决方案2】:

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

什么是名字?一个字符串?它可能是一个 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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多