2016-11-24 30 views
2

我想創建Class Foo,如下所示。 Foo的構造函數輸入Expression來獲得Type T的某些成員來做一些工作。構造函數不能接受輸入類型C#中的表達式<Func <T, TResult>>

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<ClassA> foo = new Foo<ClassA>(u=>new{u.Property1, u.Property2}); 

但這不起作用。構造函數不能擁有Generc類型TResult。 怎麼辦?

經過非常掙扎vs表達式我發現了anserw並將它寫在答案中。

+0

'美孚'不能有構造函數'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

謝謝Evk。它不會編譯。我糾正了這一點。所以這個答案是最好的。 –

4

您可以將constructuctor外部的邏輯移至獨立方法。而不是使用構造函數來創建美孚的 - 你可以使用靜態方法,像這樣:

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

我以另一種方式解決它。 –

相關問題