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

时间:2015-08-13 19:52:01

标签: c# reflection casting delegates

我有两个对象(域和数据),在这种情况下具有相同的属性(让我们假定名称)。我有一个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可能没有相同的属性。

我一直在研究Expressions和其他一些解决方案,但我无法弄清楚如何创建Cast(或者得到&#34; x =&gt; x.Name = ... &#34;部分来自方法)。

任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:1)

您无法直接或间接地将Action<DomItem>投射到Action<DataItem>,但您可以使用转换器包裹该动作,该转换器可转换来自{的输入{1}}到DataItem并在副本上运行原始操作:

DomItem

明显的缺点是该操作将应用于原始对象的副本而不是原始对象本身。如果不确切知道这个动作是什么,我就不知道如何去做&#34;演员&#34;没有共同基类型的动作。