【问题标题】:Generic Type in constructor构造函数中的泛型类型
【发布时间】:2010-10-16 14:28:54
【问题描述】:

我有一个通用类型接口,并希望一个对象的构造函数接受通用接口。
喜欢:

public Constructor(int blah, IGenericType<T> instance)
{}

我希望创建此对象的代码指定 IGenericType(使用控制反转)。我还没有看到这种情况发生的方法。有什么建议可以做到这一点吗?

我希望有人创建这样的对象:

Constructor varname = new Constructor(1, new GenericType<int>());

【问题讨论】:

    标签: c# .net generics inversion-of-control


    【解决方案1】:

    您不能将构造函数设为通用,但可以使用通用静态方法:

    public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance)
    

    然后根据需要在构造函数之后执行任何您需要的操作。在某些情况下,另一种选择可能是引入通用接口扩展的非通用接口。

    编辑:根据 cmets...

    如果要将参数保存到新创建的对象中,并且希望以强类型的方式进行,那么类型也必须是泛型的。

    此时构造函数问题消失了,但您可能仍希望在非泛型类型中保留静态泛型方法:因此您可以利用类型推断:

    public static class Foo
    {
        public static Foo<T> CreateInstance<T>(IGenericType<T> instance)
        {
            return new Foo<T>(instance);
        }
    }
    
    public class Foo<T>
    {
        public Foo(IGenericType<T> instance)
        {
            // Whatever
        }
    }
    
    ...
    
    IGenericType<string> x = new GenericType<string>();
    Foo<string> noInference = new Foo<string>(x);
    Foo<string> withInference = Foo.CreateInstance(x);
    

    【讨论】:

    • 我想将 IGenericType 保存为成员变量,为此我想我必须使整个类变得通用而不仅仅是方法...?
    • 是的,如果您需要将其作为成员变量进行强类型化,那么您应该将整个类型设为泛型,然后构造函数问题就消失了。
    • 想通过你来运行我的设计理念,看看是否有一些从根本上更好的事情要做。不要以为我可以在此评论中输入所有内容。我可以在你的博客上发帖或发邮件给你吗?
    • 不幸的是,通用静态方法不允许使用对象初始化器。这无法编译: Foo.CreateInstance(x) { Prop = "42" };
    • @Bruno:确实……这绝对是不幸的:(
    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多