试图使用Activator.CreateInstance(MyType)

时间:2011-05-25 07:57:37

标签: c# reflection activation

我有以下问题:

public class MyType
{
    public void method(int a, params object[] p){} 
    public void MyType()
    {
        method(5);
    }
}

当我使用构造函数时,一切都很好但是当我尝试使用Activator.CreateInstance(MyType);

void Factory()
{
    string componentPath = "MyType.dll";
    Assembly component = Assembly.LoadFrom(componentPath);
    Type myType= component.GetType("MyType");
    Activator.CreateInstance(myType);
}

失败,但找不到异常MyType.method(int32)。 重要的是要注意,在我向方法添加params object[] p之前,一切正常。

谢谢。

2 个答案:

答案 0 :(得分:3)

如果使用带有params的可选参数或方法的方法来传递可变数量的参数,那么您所做的就是告诉编译器当您 CALL 该方法时,请为您插入必要的参数? 可选参数和参数数组插入到调用代码中,而不是被调用代码。(有关详细说明,请参阅one of Eric Lipperts blog posts on optional parameters。)

您没有使用C#编译器,并且Reflection API不会为您插入这些参数。例如,您不仅可以通过反射来测试它,还可以使用两个程序集来测试:程序集A声明method(int X);它被编译并且dll由程序集B引用。该程序集B包含对method(42)的调用。这很好用!现在,如果您重新编译程序集A并将更改签名更改为method(int X, object bla=null)method(int X, params object[] blas),则程序集B将停止工作 - 它包含无效调用。即便如此,程序集B的源代码仍然可以 - 您只需要重新编译。

反射简直就是没有为你做任何可选参数魔法。它当然可以 - 但事实并非如此。虽然反思并不支持这一点,但DLR确实如此,这让我想到了以下内容......

解决方法:尝试使用C#关键字dynamic,如果可能(对于构造函数,它不是AFAIK) - 尝试更密切地模拟C#调用约定并支持类似可选和命名参数。您可能需要更改API的设置方式,但是要使用方法而不是构造函数。如果不看实际代码,很难给出更精确的建议。

另外:您可能正试图通过外观加载插件。 .NET有一些预制的基础设施可以帮助您解决这个问题:Add-ins and Extensibility,这可以使您的工作更轻松。

(注意:您的示例代码不完整 - 我在猜测method实际上是构造函数,但您应该发布实际代码或至少实际失败的代码段)。

答案 1 :(得分:0)

这不起作用,因为你必须在调用method()时传递至少2个参数。 params 修饰符并不意味着“可选”。

相关问题