我有一个带有通用的函数:
public static ShowTrackChangesViewModel CreateVM<T>(IList<TrackChanges> TrackChanges, T entity)
{
//How do i access T properties ?
}
这是一个entityFramework对象。我如何将它转回真实的访问其财产? 我需要写一个大的if代码吗? THX
答案 0 :(得分:8)
你可以添加这个小宝石来说明T
应该是MyBaseType
类型的对象:
public static ShowTrackChangesViewModel CreateVM<T>(IList<TrackChanges> TrackChanges, T entity) where T : MyBaseType
然后,您可以使用entity
,就像它是MyBaseType一样。如果您需要不在基类中的特定属性,那么您不需要泛型方法(因为它不是通用的!)。
希望有所帮助!
答案 1 :(得分:2)
说实话,我不认为仿制药适合您的情况,至少不能从我的问题中确定。
限制T的建议:
public static ShowTrackChangesViewModel CreateVM<T>(IList<TrackChanges> TrackChanges, T entity) where T : MyBaseType
相当于更简单:
public static ShowTrackChangesViewModel CreateVM(IList<TrackChanges> TrackChanges, MyBaseType entity)
在这里使用泛型没有任何好处。
假设您希望此方法对多个不同类的实例执行类似的操作,另一个选项就像其他人已经提到的那样,是让方法接受支持您所需操作的公共基类。
如果你很幸运,这个基类已经存在,或者你可以改变类型层次结构和因子。如果类是自动生成的,你通常可以让它们实现一个接口而不直接改变它们的代码(你当然可以使用LINQ to SQL,不确定实体框架。)
为此,您需要创建一个实现该接口的分部类。假设您有一个类别,其中包含您无法触及的代码,请创建您的界面:
public interface ISupportCreateVm
{
void SpecialOperationRequiredForCreateVM();
}
在新文件中创建一个分部类,如下所示:
public partial class Person : ISupportCreateVm
{
void SpecialOperationRequiredForCreateVM()
{
// TODO: Implement me!
}
}
然后您可以将您的方法编写为:
public static ShowTrackChangesViewModel CreateVM(IList<TrackChanges> TrackChanges, ISupportCreateVm entity)
并访问传入的任何内容的SpecialOperationRequiredForCreateVM()方法。
麻烦的是你必须为你想要传递给CreateVM的每个课程做这个,这是我猜你正在寻找泛型的东西,以便首先避免!然而,它肯定胜过大量的if语句或OO设计方面的巨大转变。