2010-08-09 69 views
18

我被卡住了。转换动作<T>转为操作<object>

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

问候 马格努斯

+5

这个问题没有道理,你不能创建一个动作,你必须指定一个类型。 – 2010-08-09 21:14:17

+1

猜测这些协变/逆变问题中的一个,否则答案将是'Action '。 – 2010-08-09 21:16:00

+2

除非T仅限于类,否则不能将开放泛型类型转换为Object。在代码中,分配给Action 的Action 在T:class时是合法的。史蒂文,只是为了澄清这一点不可能通过协变解决。 – Dykam 2010-08-09 21:19:23

回答

34

这里就是你问什么的样品(类型检查可以在最后一行添加到妥善处理无效的转换异常更加人性化):

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

可能是你可以给更多的细节这个任务虽然,因为现在它看起来有点奇怪。

+0

谢谢我以后再测试一下。 – 2010-08-10 04:16:51

+0

它的工作原理。谢谢。 :-) – Fanda 2014-04-04 12:27:34

+1

哇哇。感谢兄弟:D – brian 2014-05-26 08:36:30

0

不知道你的转换是什么意思......动作是委托的泛型声明...如果你想要一个动作代表,关于“对象”的作品,你会做这样的事情:

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

我假设你有这样的事情:

void Foo(Action<object> action) { } 

Action<something> myaction; 

而且要转换myaction这样你就可以将它传递给富。

这是行不通的。

Foo可以将任何对象传递给源自对象的动作。但我的行为只接受来自某物的物体。

0

我正在寻找一种方法来做到这一点今天偶然发现这篇文章。真的,我发现这样做的唯一简单方法是将行动<字符串>包含在新的动作<对象>内。在我的情况下,我将我的动作放入并行字典中,然后按类型检索它们。实际上,我正在处理一个消息队列,其中可以定义操作来处理具有特定类型输入的消息。

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