簡體   English   中英

泛型類的構造函數中是否可能具有強類型化的參數約束?

[英]Is it possible to have strongly typed parameter constraints in a constructor of a generic class?

我想在C#中定義一個通用類:

public class MyService<TModel>
{
    public MyService(/*What to declare here?*/)
    {
    }
}

這樣我就可以像下面這樣實例化它:

var service = new MyService<SomeModel>(m => m.SomeField);

其中SomeField被限制為SomeModel的字段。 這可能嗎?

我知道我可以為類中的方法聲明類似的內容,但不能完全弄清楚如何為構造函數完成此操作。 例如,我可以在MyService聲明以下內容:

    public void SomeMethod<TMember>(Expression<Func<TModel, TMember>> member)
    {
    }

並能夠像這樣調用它:

var service = new MyService<SomeModel>();
service.SomeMethod(m => m.SomeField);

如果編譯器會抱怨SomeField是不實際的領域SomeModel

你可以這樣做:

public class MyService<TModel>
{
    public static MyService<TModel> Create<TMember>(Func<TModel, TMember> member)
    {
        return new MyServiceImpl<TMember>(member);
    }

    private class MyServiceImpl<TMember> : MyService<TModel>
    {
        private Func<TModel, TMember> member;
        public MyServiceImpl(Func<TModel, TMember> member)
        {
            this.member = member;
        }
    }
}

所以現在我可以這樣做:

MyService<Foo> service = MyService<Foo>.Create(m => m.Name);

注意,我不需要指定成員的類型。

這是我的課堂Foo

public class Foo
{
    public string Name;
}

您必須將TModelTMember都放在構造函數的<>中。

public class MyService<TModel, TMember>
{
    public MyService(Expression<Func<TModel, TMember>> member)
    {
    }
}

您不能創建使用不屬於類的多余泛型參數的構造函數,就像使用方法一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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