在 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 使用转换器转换输入的操作从 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};
}
明显的缺点是该操作将应用于原始对象的 副本,而不是原始对象本身。在不知道动作是什么的情况下,我不知道如何在没有通用基类型的情况下 "cast" 动作。
我有两个对象(域和数据),在本例中它们具有相同的 属性(假设名称)。我有一个 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 使用转换器转换输入的操作从 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};
}
明显的缺点是该操作将应用于原始对象的 副本,而不是原始对象本身。在不知道动作是什么的情况下,我不知道如何在没有通用基类型的情况下 "cast" 动作。