C# 导入具有泛型类型参数的方法

C# 导入具有泛型类型参数的方法,c#,cil,mono.cecil,C#,Cil,Mono.cecil,我目前正在为现有API添加一个新功能。假设我有一个带有泛型类型参数的PerformTediousOperation方法: void PerformTediousOperation() 此方法位于操作符类中,可以这样调用: operatorInstance.PerformEdiousOperation() 我想创建一个新的操作符实例,并在用户使用可操作属性标记类型时调用此方法 目前,这就是我被困的地方: MethodReference performTediousOperationMethodRe

我目前正在为现有API添加一个新功能。假设我有一个带有泛型类型参数的
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感谢您的反馈。我已按要求更新了答案。现在清楚了吗?