2016-11-24 12 views
2

の式 >次のようにクラスFooを作成します。 FooのコンストラクタはExpressionを入力してType Tのメンバーの一部を取得して作業します。 コンストラクタは入力タイプを受け入れることができません。C#

class Foo<T> 
{ 
    public Foo<TResult>(Expression<Func<T, TResult>> selector) 
    { 
     List<string> memberNames = typeof(TR).GetProperties().Select(p => p.Name).ToList(); 
     ....//some work on memberNames 
    } 
} 

とコードでFooのインスタンスを作成します。

Foo<ClassA> foo = new Foo<ClassA>(u=>new{u.Property1, u.Property2}); 

が、これは動作しませんでした。コンストラクタはGeneric型TResultを持ちません。 どうすればよいですか?

私はanserwを見つけて答えに書きました。

+0

'Fooのに従うことを解決 'はコンストラクタ' Foo 'を持てません – rbm

+0

私が知る限り、あなたはそれのような' TResult'を使うことはできません。メソッドに設定する必要があります。あるいは、 'Foo 'のように 'TResult'をクラス定義に追加する必要があります。 – smoksnes

+0

はい、それはコンパイルされませんが、私はその作業が必要です。 –

答えて

0

私はと

class ClassA 
{ 
    public int MyProperty { get; set; } 
    public int MyProperty2 { get; set; } 
}  
class Foo<T> 
{ 
    public Foo(Expression<Func<T, Object>> selector) 
    { 
     var props = ((NewExpression)selector.Body).Members.Select(p => p.Name).ToList(); 
    } 
} 

Foo<ClassA> foo = new Foo<ClassA>(u => new { u.MyProperty, u.MyProperty2 }); 
+0

ここにTRは何ですか?コードはコンパイルされません。ありがとうございます。 – Evk

+0

それはコンパイルされません。私はそれを修正する。この答えは最高です。 –

4

ロジックをconsrtuctor外に移動すると、別のメソッドに移動できます。代わりにはFooを作成するためにコンストラクタを使用する - あなたは、静的メソッドを使用することができ、このように:

class Foo<T> { 
    private Foo() { 

    } 

    private void Init<TResult>(Expression<Func<T, TResult>> selector) { 
     List<string> memberNames = typeof(TResult).GetProperties().Select(p => p.Name).ToList(); 
     //some work on memberNames 
    } 

    public static Foo<T> Create<TResult>(Expression<Func<T, TResult>> selector) { 
     var foo = new Foo<T>(); 
     foo.Init(selector); 
     return foo; 
    } 
} 

そして、このようにそれを使用します。

Foo<ClassA> foo = Foo<ClassA>.Create(u=>new{u.Property1, u.Property2}); 
+0

私はそれを別の方法で解決します。 –

関連する問題