2

オブジェクトと、このオブジェクトの一連のプロパティを受け取る汎用関数を作成したいと考えています。関数内で、渡されたオブジェクトのプロパティだけである新しい匿名オブジェクトを選択したいと思います。

私はこのようなことをしたい:

public class SimpleClass
{
    public DateTime ADate {get; set;}
    public string StringHere {get; set;}
    public int ANumber {get; set;}
}

var testObj = new SimpleClass();
// set values here on testObj properties
DoStuffHere(testObj, StringHere, ANumber);

プロパティを文字列として渡し、リフレクションを使用して渡されたオブジェクトからプロパティを取得できますが、プロパティ自体を渡す方法があるかどうかを知りたかったので、IntelliSense とコンパイル時のチェックを行って防止することができました。悪いプロパティ名。getNewClass 関数が任意のタイプのオブジェクトを取り、そのようなものをジェネリックにしたいと考えています。

編集:私は新しい匿名型を返していません。私の関数名がそのように聞こえたと思います。指定された testObj のリストから新しい匿名型を内部的に選択し、それらのプロパティから PDF を生成します。

4

3 に答える 3

4

匿名型の定義は実際には非常に複雑であり、名前だけでそれを行うのはやや困難です。基本的に、必要なものは既に存在しますが、通常の C# では、単一のオブジェクトの場合:

var obj = new { testObj.StringHere, testObj.ANumber };

または複数のオブジェクトの場合:

var projection = from obj in sequence
                 select new { obj.StringHere, obj.ANumber };

それはあなたが得るのと同じくらい簡潔です。何らかの種類の を使用するジェネリック メソッドを追加することもできますがFunc<,>、上記よりもクリーンではありません。

持っていると役に立ちません:

var obj = SomeMagicMethod(obj, "StringHere", "ANumber");

SomeMagicMethod有効に返すことしかできないためobjectobj変数はほとんど使用できなくなります。


メソッドからオブジェクトを返す必要がない場合は、次のいずれかを使用できます。

SomeMagicMethod<T>(T value) {
   ...
}
...
SomeMagicMethod(new {testObj.StringHere, testObj.ANumber });

また:

SomeMagicMethod<TFrom, TTo>(TFrom value, Func<TFrom, TTo> selector)
{
    TTo actualVal = selector(value);
    ...
}
...
SomeMagicMethod(testObj, x => new {x.StringHere, x.ANumber });

個人的には、前者の方が簡単だと思います。後者の関数はやり過ぎです。

リフレクションを使用することもできます...

SomeMagicMethod(object obj, params string[] names)
{
    foreach(var name in names) {
       object val = obj.GetType().GetProperty(name).GetValue(obj);
       // ...
    }
}
//...
SomeMagicMethod(testObj, "StringHere", "ANumber");
于 2013-09-24T13:34:25.157 に答える
0

それらをラムダとして渡すことができます:

GetNewClass (testObj, ()=>StringHere, ()=> ANumber);

GetNewClassのような署名を持っています

void GetNewClass (object, Expression<Func<object>> expr0, Expression<Func<object>> expr1);

その後、非常に簡単にプロパティを取得できます。

于 2013-09-24T13:35:46.090 に答える