将Action <t>转换为Action <object> </object> </t>

时间:2010-08-09 21:11:41

标签: c#

我被困住了。

如何转换C#中的Action<T> to an Action<Object>

此致 马格努斯

5 个答案:

答案 0 :(得分:44)

以下是您要求的示例(可以在最后一行添加类型检查以正确处理无效的强制转换异常,以便更加用户友好):

public Action<object> Convert<T>(Action<T> myActionT)
{
    if (myActionT == null) return null;
    else return new Action<object>(o => myActionT((T)o));
}

可能你可以提供有关任务的更多细节,因为现在它看起来有点奇怪。

答案 1 :(得分:1)

我今天正在寻找一种方法来做这件事并偶然发现这篇文章。真的,我发现这样做的唯一简单方法就是包装Action&lt; string&gt;在一个新的Action&lt; object&gt;中在我的例子中,我将我的动作推入并发字典,然后按类型检索它们。实际上,我正在处理一个消息队列,其中可以定义操作来处理具有特定类型输入的消息。

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);

答案 2 :(得分:0)

不确定你的意思是转换... Action是动作委托的通用声明...如果你想要一个对'object'起作用的动作委托,你会做类似的事情:

var myAction = new Action<object>(obj=> ... );

答案 3 :(得分:0)

我认为你有类似的东西:

void Foo(Action<object> action) { }

Action<something> myaction;

并希望转换myaction,以便将其传递给Foo。

这不起作用。

Foo可以将任何对象传递给类型派生自object的动作。但是myaction只接受来自某些东西的对象。

答案 4 :(得分:0)

您可以像这样添加通用参数

    Action<object> Function<T>(Action<T> act) where T : class
    {
        return (Action<object>)act;
    }