gpt4 book ai didi

c# - 在运行时创建通用类型的 Action<>

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:12 25 4
gpt4 key购买 nike

是否可以在运行时基于某些特定类型创建通用类型的 Action?在这种特殊情况下,Action 的主体最终将忽略参数类型,因为类型化的 Action<> 将只是一个无参数 Action 的包装器,例如

Action original = () => { };
...
Action<TType> wrapper = (arg) => {
original();
}

或者,甚至:

Action<TTypeA, TTypeB> wrapper = (arg) => {
original();
}

如您所见,类型化 Action<> 的主体忽略参数及其类型,它只是充当包装器。

如果您对我为什么首先要创建此包装感到好奇,“基本”版本是我最终将 Action 转换为 Delegate 以执行 Delegate.Combine(),这需要相同的类型.我试图用 Delegate.Combine() 完成的只是一个基本通知,即委托(delegate)已被解雇。

在这一点上,我可能会重新设计我的设计以避免这些类型的恶作剧,但我仍然很好奇这是如何实现的。

我能得到的最接近的是:

private static TType GetTypedDelegate<TType>(Action onComplete)
where TType : class
{
MethodInfo info = typeof(TType).GetMethod("Invoke");
ParameterInfo[] parameters = info.GetParameters();

object result;
if (parameters.Length == 0)
result = onComplete;
else if (parameters.Length == 1)
result = GetTypedDelegate<TType>(onComplete, parameters[0].ParameterType);
// etc

TType onCompleteCasted = Delegate.CreateDelegate(typeof(TType), result, "Invoke") as TType;
return onCompleteCasted;
}

private static Delegate GetTypedDelegate<TType>(Action onComplete, Type type)
{
// This line isn't useful for me right now, since I can't just create a new
// instance of the action with a parameterless constructor ... but I thought I'd throw it in here in case it was of use
Type actionType = typeof(Action<>).MakeGenericType(new[] { type });

// Do some magic here with the type information
// The following of course does not work,but you get the idea of what I am aiming for

Action<type> wrapper = (arg1) =>
{
onComplete();
};

return wrapper as Delegate;
}

最佳答案

我认为最简单的选择是编写一个通用方法然后动态调用它(使用反射或者甚至可能使用 C# 4 dynamic):

class Helper {
public static Action<TType> Wrap1<TType>(Action arg) {
return (arg) => { original(); }
}
}

使用反射调用方法并使用 typ1 作为泛型类型参数可能如下所示:

var meth = typeof(Helper).GetMethod("Wrap1");
var gmeth = meth.MakeGenericMethod(new[] { typ1 });
var genericAction = gmeth.Invoke(null, new object[] { action });

关于c# - 在运行时创建通用类型的 Action<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6495058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com