vmb*_*vmb 0 .net c# generics generic-collections
我有两个类,它具有以下属性
Class A
{
public int CustID { get; set; }
public bool isProcessed { get; set; }
}
Class B
{
public int EmpId{ get; set; }
public bool isProcessed { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个接受所有这些类的泛型方法.'isProcessed'属性在这两个类中都很常见.
public void ProceesData<T>(IList<T> param1, string date1)
{
}
Run Code Online (Sandbox Code Playgroud)
我需要关注的事情
注意:我更喜欢使用反射的解决方案,因为属性名称是常量(即"IsProcessed")
任何人都可以帮助这个.
最简单的方法是确保两个类都实现一个公共接口并约束您的泛型方法.例如:
public interface IProcessable
{
bool isProcessed { get; set; }
}
public class A : IProcessable
{
public int CustID { get; set; }
public bool isProcessed { get; set; }
}
public class B : IProcessable
{
public int EmpId { get; set; }
public bool isProcessed { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在你的方法看起来像这样:
public void ProceesData<T>(IList<T> param1, string date1)
where T : IProcessable // <-- generic constraint added
{
foreach (var element in param1)
{
element.isProcessed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不能使用接口或属性名称变得更有用的另一个选项是Action<T>
将参数作为参数传递给您的方法.例如:
public void ProceesData<T>(IList<T> param1, string date1, Action<T> func)
{
foreach (var element in param1)
{
func(element);
}
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
ProceesData<A>(list, "", x => x.isProcessed = true);
Run Code Online (Sandbox Code Playgroud)