[英]Constructor can't accept input type Expression<Func<T, TResult>> in C#
我想按如下方式創建類Foo
。
Foo
構造函數輸入表達式必須讓Type T
的一些成員來做一些工作。
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<T>
實例:
Foo<ClassA> foo = new Foo<ClassA>(u=>new{u.Property1, u.Property2});
但是,這不起作用並給出了以下錯誤:
Constructor can't have Generic type TResult.
我怎樣才能解決這個問題?
編輯:
在努力理解表達后,我找到了答案並將其寫為答案。
您可以將構造函數之外的邏輯移至單獨的方法。 而不是使用構造函數來創建 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});
我解決如下
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 });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.