簡體   English   中英

構造函數不能接受輸入類型表達式<Func<T, TResult> &gt; 在 C# 中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM