C# 如何对任意目标和参数调用MethodInfo对象?

C# 如何对任意目标和参数调用MethodInfo对象?,c#,.net,C#,.net,我知道有很多人会问与此完全相同的问题,但是,他们没有做我想做的事情。我想要类似JavaScript的.call()。与此最相似的是Delegate.DynamicInvoke(),但我不知道如何将我拥有的MethodInfo对象转换为委托,因为我在MethodInfo.CreateDelegate()中没有委托类型可供使用。我看到有一个\u MethodInfo.Invoke(),但它看起来非常复杂 基本上我想要这样的东西,但在C#: //假设这是一个实际的类或其他东西 someclass.pr

我知道有很多人会问与此完全相同的问题,但是,他们没有做我想做的事情。我想要类似JavaScript的
.call()
。与此最相似的是
Delegate.DynamicInvoke()
,但我不知道如何将我拥有的
MethodInfo
对象转换为委托,因为我在
MethodInfo.CreateDelegate()中没有委托类型可供使用。我看到有一个
\u MethodInfo.Invoke()
,但它看起来非常复杂

基本上我想要这样的东西,但在C#:

//假设这是一个实际的类或其他东西
someclass.prototype.something=函数(其他名称){
console.log(this.name,otherName);
}
设obj={
名称:“单词”
};
一些东西。叫(obj,‘更多单词’);

这就是我要找的

使用系统;
名称空间测试{
公共班级1{
公共int值=1;
公共静态void Main(字符串[]args){
var mInfo=typeof(Class1).GetMethod(“Add”);
Class1 knownType=新的Class1();
对象sortaUnknownType=new Class1();
对象anonType=new{value=1};
//显然,这是可行的
objectv1=mInfo.Invoke(knownType,新对象[]{1});
Console.WriteLine($“v1={v1}”);
//sortaUnknownType的类型仍然是Class1
//.GetType()将显示以下内容
objectv2=mInfo.Invoke(sortaUnknownType,新对象[]{2});
Console.WriteLine($“v2={v2}”);
//这会崩溃,因为它不是真正的Class1类型
//此外,它不能强制转换为Class1,因为
//它的类型{int value}与前面提到的注释相同
objectv3=mInfo.Invoke(anonType,新对象[]{3});
WriteLine($“v3={v3}”);
}
//这就是我要调用的方法
公共整数添加(整数输入){
返回此值+输入;
}
}
}
是我在评论中提到的方法:
void _MethodInfo.Invoke(uint dispIdMember,ref Guid riid,uint lcid,short wFlags,IntPtr pDispParams,IntPtr pVarResult,IntPtr pExcepInfo,IntPtr puArgErr)

“它看起来很复杂”-你试过使用它吗?怎么搞的?指定目标和目标的参数。。。这对我来说似乎并不复杂,但在不知道你做了什么以及发生了什么的情况下,我们无法说出你觉得复杂的地方。那么你在调用invoke时遇到了什么问题?您尝试了什么?它是如何失败的?MethodInfo.Invoke()有什么复杂之处?我不是js方面的专家,但是
调用
在用法上与
调用
非常相似。对于
MethodInfo.Invoke()
-第一个参数是调用方法的对象(如果方法是静态的,则使用
null
)(即代码中的
obj
),第二个参数-包含所有“其他”方法参数的数组(即
new[]{“more words”}
将类似于js代码)。你也可以随时查看,有时可以让你了解它的用法。好吧,我觉得自己像个小丑。在MSDN
MethodInfo
文档中,左侧边栏没有
MethodInfo.Invoke()
,因为它继承自
MethodBase
,它只有
\u MethodInfo.Invoke()
,这需要一些指针(我认为)。我将使用
MethodInfo.Invoke()
并为此编写一个新的答案,因为其他答案都有好几年的历史了,或者别的什么。C中的任何内容都不会与您发布的JavaScript直接类似,因为在C中,实例方法直接绑定到它声明的类型。您不能对任何对象调用实例方法,除非它声明的类型是实例。但是,如果您愿意确保对象的类型正确(
let obj=new someclass();
),或者调用静态方法,那么使用标准反射库应该非常容易。