演员Action< T1>Action< T2>在c#中T1和T2没有关系

本文关键字:T1 T2 Action 没有关系 演员 | 更新日期: 2023-09-27 18:07:54

我有两个对象(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< T1>Action< T2>在c#中T1和T2没有关系

您不能直接或间接地将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};
}
明显的缺点是,该操作将应用于原始对象的副本,而不是原始对象本身。在不知道动作是什么的情况下,我不知道如何在没有通用基类型的情况下"强制转换"动作。