类别和 Activator.CreateInstance

发布于 2024-12-06 23:27:09 字数 650 浏览 3 评论 0原文

这是一些类:

public class MyClass<T, C> : IMyClass where T : SomeTClass
                                              where C : SomeCClass
{
    private T t;
    private C c;


    public MyClass()
    {
        this.t= Activator.CreateInstance<T>();
        this.c= Activator.CreateInstance<C>();
    }
}

我试图通过这样做来实例化此类的对象:

            Type type = typeof(MyClass<,>).MakeGenericType(typeOfSomeTClass, typeOfSomeCClass);
            object instance = Activator.CreateInstance(type);

我得到的只是一个 System.MissingMethodException (该对象没有无参数构造函数)。我

的代码有什么问题吗?

Here is some class:

public class MyClass<T, C> : IMyClass where T : SomeTClass
                                              where C : SomeCClass
{
    private T t;
    private C c;


    public MyClass()
    {
        this.t= Activator.CreateInstance<T>();
        this.c= Activator.CreateInstance<C>();
    }
}

And I'm trying to instanciate object of this class by doing this:

            Type type = typeof(MyClass<,>).MakeGenericType(typeOfSomeTClass, typeOfSomeCClass);
            object instance = Activator.CreateInstance(type);

And all I get is a System.MissingMethodException(there is no no-arg constructor for this object)...

What is wrong with my code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

人间☆小暴躁 2024-12-13 23:27:09

听起来 typeOfSomeTClasstypeOfSomeCClass 是一种没有公共无参数构造函数的类型,按照以下要求:

this.t = Activator.CreateInstance<T>();
this.c = Activator.CreateInstance<C>();

您可以通过约束强制执行:

where T : SomeTClass, new()
where C : SomeCClass, new()

在这种情况下,您可以然后也做:

this.t = new T();
this.c = new C();

It sounds like typeOfSomeTClass or typeOfSomeCClass is a type that doesn't have a public parameterless constructor, as required by:

this.t = Activator.CreateInstance<T>();
this.c = Activator.CreateInstance<C>();

You could enforce that via a constraint:

where T : SomeTClass, new()
where C : SomeCClass, new()

in which case you can also then do:

this.t = new T();
this.c = new C();
柠北森屋 2024-12-13 23:27:09

MakeGenericType 在此上下文中应使用 Type 数组。

请参阅 http://msdn.microsoft.com/en-us/ library/system.type.makegenerictype.aspx

例如

Type type = typeof(LigneGrille<,>).MakeGenericType(new Type[] {typeOfSomeTClass, typeOfSomeCClass});

MakeGenericType should use an array of Type in this context.

See http://msdn.microsoft.com/en-us/library/system.type.makegenerictype.aspx

For example

Type type = typeof(LigneGrille<,>).MakeGenericType(new Type[] {typeOfSomeTClass, typeOfSomeCClass});

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文