在使用obect的属性名强类型的方式(Using obect's property name

2019-10-18 23:27发布

有没有一种方法(在C#.NET 4.0),提供对象属性名强类型的方式? 举例来说,如果我们有一个对象者

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

我想发送给其他一些方法的参数名称,年龄属性名称,但不是作为字符串,但强类型:

SomeMethodThatWantToKnowKeys(Person.Name,Person.Age);

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

Answer 1:

如果我知道你想什么,你可以使用表达式 :

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"


Answer 2:

好了,同时也有一些丑陋的黑客有一个更好的和推行清洁解决方案。 这个问题是因为抽象不到位。

什么是叫什么名字? 一个字符串? 这可能是一个int,双,焦炭,浮....什么...你真的不关心底层的类型。 你关心的名称的概念或观念。 我知道这是更加深了一点,但是这方面的经验将帮助您提供良好的设计。

以下是我建议现在,但我个人会去做得更多。

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);

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



文章来源: Using obect's property names in strongly type way