通用铸造问题C#

时间:2010-08-03 16:42:20

标签: c# generics

我有一个带有通用的函数:

public static ShowTrackChangesViewModel CreateVM<T>(IList<TrackChanges> TrackChanges, T entity)
        {
            //How do i access T properties ?

        }

这是一个entityFramework对象。我如何将它转回真实的访问其财产? 我需要写一个大的if代码吗? THX

2 个答案:

答案 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的每个课程做这个,这是我猜你正在寻找泛型的东西,以便首先避免!然而,它肯定胜过大量的i​​f语句或OO设计方面的巨大转变。

相关问题