我有两个对象(Domain和Data),在本例中具有相同的属性(假设为Name)。我有一个Action<DomItem>
,我想把它转换成Action<DataItem>
。
public class DomItem {
public string Name { get; set; }
}
public class DataItem {
public string Name { get; set; }
}
public class Program {
public Program() {
Action<DomItem> domAction = new Action<DomItem>(x=>x.Name = "Test");
// Something Casted To Action<DataItem>(x=>x.Name = "Test");
}
}
当然这只是一个基本的例子。这是设计,我不能使用一个共同的接口。我不关心DataItem
是否具有相同的属性
我一直在寻找表达式和其他几个解决方案,但我只是不知道如何创建Cast(或获得"x=>x")。Name =…"部分从方法)。
任何帮助都将非常感激!
您不能直接或间接地将Action<DomItem>
转换为Action<DataItem>
,但您可以用转换器将动作从DataItem
转换为DomItem
,并在副本上运行原始动作:
public Action<DataItem> Convert(Action<DomItem> action)
{
return new Action<DataItem>(o => action(Map(o)));
}
public DomItem Map(DataItem dataItem)
{
return new DomItem{Name = dataItem.Name};
}
明显的缺点是,该操作将应用于原始对象的副本,而不是原始对象本身。在不知道动作是什么的情况下,我不知道如何在没有通用基类型的情况下"强制转换"动作。