我该如何在C#中将 Action<T>
转换为 Action<Object>
?
以下是您所要求的示例(可以在最后一行添加类型检查,以正确处理无效转换异常,使其更加用户友好):
public Action<object> Convert<T>(Action<T> myActionT)
{
if (myActionT == null) return null;
else return new Action<object>(o => myActionT((T)o));
}
if
.. else
.. 结构,即使涉及到 return
语句。原因是:这将在视觉上将在同一级别(这里是下一级)的逻辑上处于相同级别的语句放置在一起。也就是说,两个前进路径都由 if
的“条件”选择;它们可以被视为从主要流程“向下一级”的两个不同路径。在我看来,你建议的风格和这里所做的风格同样有效。这是一种权衡,取决于编码者选择强调什么。 - ToolmakerSteve Action<object> Function<T>(Action<T> act) where T : class
{
return (Action<object>)act;
}
where T : class
。 - Sameman我假设你有类似这样的代码:
void Foo(Action<object> action) { }
Action<something> myaction;
我想将我的操作转换为可以传递给Foo的形式。
但这样行不通。
Foo可以将任何类型派生自object的对象传递给该操作。但是,myaction只接受从某些东西派生的对象。
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' 工作的操作委托,您可以这样做:
var myAction = new Action<object>(obj=> ... );
Action<object>
。 - Steven SuditT : class
。 - ToolmakerSteve