是否可以在泛型类的构造函数中使用强类型参数约束?

时间:2016-02-17 02:16:55

标签: c# generics reflection

我想在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的字段,编译器会抱怨。

2 个答案:

答案 0 :(得分:3)

你可以这样做:

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;
}

答案 1 :(得分:1)

您必须将parforTModel都放在构造函数的TMember中。

<>

您不能像使用方法一样创建使用不属于类的额外通用参数的构造函数。