在C#中,如何使用两种不同类型的泛型?

时间:2017-03-22 15:45:33

标签: c# generics

我有一些由Entity Framework创建和维护的类。这些类代表我的数据库中的表。在其中两个表中,我有非常相似的字段。例如(伪对象):

public class RandomObject1
{
    int Identifier { get; set; }
    int ObjectType { get; set; }
    int SourceID   { get; set; }
    string OriginationPont { get; set; }
    string PhoneNumber { get; set; }
    decimal Cost { get; set; }

    int OtherThing1 { get; set; }
    int OtherThing2 { get; set; }
    int OtherThing3 { get; set; }
}

public class RandomObject2
{
    int Identifier { get; set; }
    int ObjectType { get; set; }
    int SourceID   { get; set; }
    string OriginationPont { get; set; }
    string PhoneNumber { get; set; }
    decimal Cost { get; set; }

    double CashValue1 { get; set; }
    decimal Snowman2 { get; set; }
    int BigFurryTree3 { get; set; }
}

请注意,这两个对象的前几个字段是相同的,填充这些字段的过程也是相同的。通常在这些情况下,我会有一个接口,只声明前几个字段,以便我可以将此对象作为各种进程的接口传递。

但是,在这种情况下,我不控制构建这些类的代码,并且实际上不希望每次都必须从Entity Framework编辑生成的.cs文件再生。

我想知道是否有一种光滑的方式,我缺少使用泛型来执行以下操作:

// This method will populate SourceID, OriginationPoint, PhoneNumber and Cost
public void GenerateOriginationInformation<T>(ValidationInformation info, T objectToManipulate) where T : RandomObject1 || RandomObject2
{
    objectToManipulate.SourceID = GenerateSourceID(info);
    objectToManipulate.OriginationPoint = GenerateOriginationPoint(info);
    objectToManipulate.PhoneNumber = FindPhoneNumberByOrigination(info);
    objectToManipulate.Cost = DetermineCostBySourceAndOrigination(info);
}

现在,我必须构建一个完整的对象/图层来填充并返回正确的对象,但这会导致我为这些东西做两次代码!

public void GenerateOriginationInformation(ValidationInformation into, RandomObject1 objectToManipulate) 
{
    objectToManipulate.SourceID = GenerateSourceID(info);
    objectToManipulate.OriginationPoint = GenerateOriginationPoint(info);
    objectToManipulate.PhoneNumber = FindPhoneNumberByOrigination(info);
    objectToManipulate.Cost = DetermineCostBySourceAndOrigination(info);
}

public void GenerateOriginationInformation(ValidationInformation into, RandomObject2 objectToManipulate) 
{
    objectToManipulate.SourceID = GenerateSourceID(info);
    objectToManipulate.OriginationPoint = GenerateOriginationPoint(info);
    objectToManipulate.PhoneNumber = FindPhoneNumberByOrigination(info);
    objectToManipulate.Cost = DetermineCostBySourceAndOrigination(info);
}

起初,这看起来并不太糟糕,但出于解释和简洁的目的,此代码高度过度简化。是否有一种更简洁的方法来使用泛型来使两种方法一起工作,因为我无法实现接口?

2 个答案:

答案 0 :(得分:6)

I don't control the code that builds these classes, and really don't want to have to edit the resulting .cs files from the Entity Framework every time it is regenerated

  

回答评论:&#34;它是EDMX&#34;

默认情况下,EDMX设计器生成的类是部分的(您无需额外的工作),因此您可以使用partial创建生成文件旁边的代码文件在其中使类型实现接口。

生成的课程

public partial class RandomObject1

您的代码文件放在同一个项目中

public partial class RandomObject1 : ICommonInterface

答案 1 :(得分:5)

实体框架生成的类可能是“部分”的。这意味着您可以编写自己的分部类,以将自己的功能添加到该生成的类中。

如:

public partial class RandomObject1: ICommonInterface
{
}

使用“ICommonInterface”指定共享属性的接口。