1

(c# .Net 4.0 で) オブジェクトのプロパティ名を厳密に型指定する方法はありますか? たとえば、オブジェクト Person がある場合

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

そして、パラメーター Name、Age プロパティ名を他のメソッドに送信したいのですが、文字列としてではなく、強く入力します。

SomeMethodThatWantToKnowKeys(Person.Name,Person.Age);

私が達成したいのは、誰かがプロパティ名を変更した場合、彼は「SomeMethodThatWantToKnowKeys」に送信しているプロパティ名を変更する必要があるということです。もしかして反省?より良い方法は、オブジェクト自体を更新したり、インスタンスを作成したりしないことです。

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 に答える