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

Importing methods with generic type parameters

我目前正在为现有 API 添加新功能。假设我有一个带有泛型类型参数的 PerformTediousOperation 方法:

void PerformTediousOperation<T>()

此方法在 Operator class 中,可以这样调用:

operatorInstance.PerformTediousOperation<T>()

我想创建一个新的 Operator 实例并在用户使用 Operable 属性标记类型时调用此方法。

目前,这是我卡住的地方:

MethodReference performTediousOperationMethodReference =
    new MethodReference(
        name: "PerformTediousOperation",
        returnType: moduleDefinition.TypeSystem.Void,
        declaringType: operatorTypeReference)
    {
        HasThis = true
    };

发出的 IL 代码(在 C# 中)只是 PerformTediousOperation();

如何解决此问题,以便发出的代码改为 PerformTediousOperation<T>(),其中 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<int>()

您可以将任何其他 TypeReference 实例传递给 GenericArguments 字段,输出将相应不同。例如。如果您改为传入 moduleDefinition.ImportReference(typeof(string)),则输出将为 PerformTediousOperation<string>().