![](/img/trans.png)
[英]How to convert Expression<Action<T, object>> to Expression<Action<T, U>>?
[英]Convert Action<T> to Action<object>
我被困住了。
如何在 C# 中将Action<T> to an Action<Object>
?
问候马格努斯
这是您要求的示例(可以在最后一行添加类型检查以正确处理无效的强制转换异常以更加用户友好):
public Action<object> Convert<T>(Action<T> myActionT)
{
if (myActionT == null) return null;
else return new Action<object>(o => myActionT((T)o));
}
不过,也许您可以提供有关该任务的更多详细信息,因为现在它看起来有点奇怪。
我假设你有这样的事情:
void Foo(Action<object> action) { }
Action<something> myaction;
并希望转换 myaction 以便您可以将其传递给 Foo。
那行不通。
Foo 可以将任何对象传递给其类型从对象派生的操作。 但是 myaction 只接受从某物派生的对象。
我今天正在寻找一种方法来做到这一点,并偶然发现了这篇文章。 真的,我发现的唯一简单方法是将 Action<string> 包装在一个新的 Action<object> 中。 就我而言,我将我的操作推送到并发字典中,然后按类型检索它们。 实际上,我正在处理一个消息队列,其中可以定义操作来处理具有特定类型输入的消息。
var _actions = new ConcurrentDictionary<Type, Action<object>>();
Action<string> actionStr = s => Console.WriteLine(s);
var actionObj = new Action<object>(obj => { var castObj = (V)Convert.ChangeType(obj, typeof(V)); actionStr(castObj); } );
_actions.TryAdd(typeof(string), actionObj);
您可以像这样添加通用参数
Action<object> Function<T>(Action<T> act) where T : class
{
return (Action<object>)act;
}
不确定转换是什么意思... Action 是动作委托的通用声明...如果您想要一个适用于“对象”的动作委托,您可以执行以下操作:
var myAction = new Action<object>(obj=> ... );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.