导入具有泛型类型参数的方法
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>()
.
我目前正在为现有 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>()
.