我有以下问题:
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
之前,一切正常。
谢谢。
答案 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 修饰符并不意味着“可选”。