C# 使用反射传递参数时,Visual studio强制转换是多余的

C# 使用反射传递参数时,Visual studio强制转换是多余的,c#,reflection,C#,Reflection,在这一行代码中,VS2015显示了两个参数的“强制转换是冗余的”(但有效!!) 它会引发“System.MissingMethodException”异常: 类型上的构造函数 未找到“iBI.Services.Hsd.Operations.Schedule.RefreshUsedOperation” 用法有什么问题吗?或者这只是visual studio的错误警报?我认为这是VS的错误警报,因为反射需要这些强制转换来知道调用哪个构造。如果没有这些强制转换,您提供的参数就没有类型,这使得Activ

在这一行代码中,VS2015显示了两个参数的“强制转换是冗余的”(但有效!!)

它会引发“System.MissingMethodException”异常:

类型上的构造函数 未找到“iBI.Services.Hsd.Operations.Schedule.RefreshUsedOperation”


用法有什么问题吗?或者这只是visual studio的错误警报?

我认为这是VS的错误警报,因为反射需要这些强制转换来知道调用哪个构造。如果没有这些强制转换,您提供的参数就没有类型,这使得Activator不可能知道要使用哪个签名,特别是如果您有多个构造函数,其中包含两个不同类型的参数。警告可能来自这样一个事实,即这在几乎所有其他情况下都是多余的,因为null可以适用于所有引用类型(如果您尝试在值类型中放置null,编译器将抛出错误),并且将(有点)采用其容器的类型。此时,如果您希望可以使用Visual Studio打开错误报告,因为这确实是可以(应该?)修复的

Activator.CreateInstance(type, null, null)
它实际上在呼叫

CreateInstance(Type type, object[] args, object[] activationAttributes)
方法重载和此CreateInstance重载将查找找不到的无参数构造函数

当你打电话的时候

Activator.CreateInstance(type, (IOperationContext)null, (Dictionary<string, object>)null);

超载。然后找到并调用带有两个参数的ctor。两个参数都作为null传递。

实际上,VisualStudio是正确的,因为两个类型转换都是冗余的。如果您删除其中一个强制转换,但将另一个保留在那里,VS将停止抱怨,因为您没有任何冗余强制转换,但仍有足够的信息来调用正确的方法重载:

这两个选项都可以:

Activator.CreateInstance(type, null, (Dictionary<string, object>)null);
Activator.CreateInstance(type, (OperationContext)null, null);
Activator.CreateInstance(类型,null,(字典)null);
CreateInstance(类型,(OperationContext)null,null);

您的IDE没有问题。只需打开并查看覆盖:和。当你写道:

Activator.CreateInstance(type, (IOperationContext)null, (Dictionary<string, object>)null);
我认为,.NET将其解释为,这就是您遇到问题的原因。 您可以尝试编写下一个代码:

Activator.CreateInstance(youType, args:null, activationAttributes:null);

它应该可以工作。

你能给我一个CreateInstance(Type Type,params object[]args)重载的链接吗,MSDN我不知道怎么想?当然
Activator.CreateInstance(type, null, (Dictionary<string, object>)null);
Activator.CreateInstance(type, (OperationContext)null, null);
Activator.CreateInstance(type, (IOperationContext)null, (Dictionary<string, object>)null);
Activator.CreateInstance(type, null, null);
Activator.CreateInstance(youType, args:null, activationAttributes:null);