在 C# 中将 Action<T1> 转换为 Action<T2>,其中 T1 和 T2 没有关系

Cast Action<T1> to Action<T2> in c# where T1 and T2 have no relation

我有两个对象(域和数据),在本例中它们具有相同的 属性(假设名称)。我有一个 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 可能不会有相同的 属性。

我一直在研究表达式和其他几种解决方案,但我就是想不出如何创建演员表(或从方法中获取 "x=>x.Name =..." 部分)。

任何帮助将不胜感激!

您不能直接或间接将 Action<DomItem> 转换为 Action<DataItem>,但您可以 wrap 使用转换器转换输入的操作从 DataItemDomItem 并在副本上运行原始操作:

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

明显的缺点是该操作将应用于原始对象的 副本,而不是原始对象本身。在不知道动作是什么的情况下,我不知道如何在没有通用基类型的情况下 "cast" 动作。