【问题标题】:Cast Action<T1> to Action<T2> in c# where T1 and T2 have no relation在 C# 中将 Action<T1> 转换为 Action<T2>,其中 T1 和 T2 没有关系
【发布时间】:2015-11-06 22:49:44
【问题描述】:

我有两个对象(域和数据)在这种情况下具有相同的属性(假设名称)。我有一个Action&lt;DomItem&gt;,我想将其转换为Action&lt;DataItem&gt;

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 =...”部分)。

任何帮助将不胜感激!

【问题讨论】:

  • 为什么不直接使用 AutoMapper?
  • 请解释一下oleksii.
  • 克里斯蒂安,这只是一个例子。我希望 DataItem 对自己运行我在 DomItem 上定义的操作。
  • 回应 Oleksii:我有基于我的 DomItem 定义的操作。我需要将它们转换为基于 DataItem 的操作。这不是我想使用 Before 或 After Mapping。我真的需要施放行动。
  • @MightyMouseTheSecond 看看this 的回答。应该是你需要的东西。

标签: c# reflection casting delegates


【解决方案1】:

您不能直接或间接将Action&lt;DomItem&gt; 转换为Action&lt;DataItem&gt;,但您可以包装使用转换器将输入从DataItem 转换为@987654324 @ 并在副本上运行原始操作:

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

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

【讨论】:

  • 这不起作用,因为操作不是设置名称,但我希望 DataItem(转到 EF)执行某个 SQLQuery(因此是操作)。我试图简化问题以防止出现大量代码。我真的需要知道如何将 Action 转换为 Action 而不是 work-arround。谢谢你的回答。
  • 您不能将Action&lt;T1&gt; 转换为Action&lt;T2&gt;。请注意,返回的操作不是设置名称 - 它是包装 original 操作,传入一个新的DomItem,其属性映射自原始DataItem
  • 感谢您的意见@D-stanley。我会尝试寻找另一种解决方案。
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
相关资源
最近更新 更多