C# 导入具有泛型类型参数的方法
我目前正在为现有API添加一个新功能。假设我有一个带有泛型类型参数的C# 导入具有泛型类型参数的方法,c#,cil,mono.cecil,C#,Cil,Mono.cecil,我目前正在为现有API添加一个新功能。假设我有一个带有泛型类型参数的PerformTediousOperation方法: void PerformTediousOperation() 此方法位于操作符类中,可以这样调用: operatorInstance.PerformEdiousOperation() 我想创建一个新的操作符实例,并在用户使用可操作属性标记类型时调用此方法 目前,这就是我被困的地方: MethodReference performTediousOperationMethodRe
PerformTediousOperation
方法:
void PerformTediousOperation()
此方法位于操作符
类中,可以这样调用:
operatorInstance.PerformEdiousOperation()
我想创建一个新的操作符
实例,并在用户使用可操作
属性标记类型时调用此方法
目前,这就是我被困的地方:
MethodReference performTediousOperationMethodReference =
new MethodReference(
name: "PerformTediousOperation",
returnType: moduleDefinition.TypeSystem.Void,
declaringType: operatorTypeReference)
{
HasThis = true
};
发出的IL代码(在C#中)只是PerformTediousOperation()代码>
如何修复此问题,使发出的代码改为PerformTediousOperation()
,其中T
将在运行时确定
如果需要更多信息,请告诉我。以下是一个示例,说明如何使用MonoCecil
生成具有泛型类型参数的方法:
MethodReference performTediousOperationMethodReference =
new MethodReference(
name: "PerformTediousOperation",
returnType: moduleDefinition.TypeSystem.Void,
declaringType: operatorTypeReference)
{
HasThis = true
};
var genericParameter = new GenericParameter("T", performTediousOperationMethodReference);
performTediousOperationMethodReference.GenericParameters.Add(genericParameter);
GenericInstanceMethod performTediousOperationInstanceMethod =
new GenericInstanceMethod(performTediousOperationMethodReference)
{
GenericArguments = { moduleDefinition.ImportReference(typeof(int)) }
};
这将生成PerformTediousOperation()
您可以将任何其他TypeReference
实例传递到genericalarguments
字段,输出将相应地有所不同。例如,如果您传入moduleDefinition.ImportReference(typeof(string))
,则输出将是PerformTediousOperation()
我猜?@canton7谢谢,我找到了方法。什么是runtimedefinedType
?它没有出现在您的问题或答案的其他地方,这使得它对其他有相同问题的人来说有些无用。在我的例子中,runTimeDeterminedType
指的是标记有operative
属性的类型。例如,如果我有一个标记为可操作的DummyClass
,则生成的IL代码将是PerformTediousOperation()
。我猜runTimeDeterminedType
是个坏名字;但基本上,我们的想法是,无论您传递到GenericaArguments
字段的类型引用是什么,都将显示为
中指定的类型。您是否可以发布一些更为独立的代码,这些代码可能对其他有相同问题的人有用?@canton7感谢您的反馈。我已按要求更新了答案。现在清楚了吗?