我目前正在努力向现有API添加新功能。假设我有一个PerformTediousOperation
带有通用类型参数的方法:
void PerformTediousOperation<T>()
此方法在Operator
类内部,可以这样调用:
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>()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句