繁体   English   中英

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

[英]In C#, how do I use generics with two different types?

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

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);
}

乍一看,这看起来还不错,但是出于解释和简洁的目的,此代码过于简化。 因为无法实现接口,有没有一种使用泛型的更干净的方法来使这两种方法合而为一?

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

在评论中回答:“这是EDMX”

缺省情况下,由EDMX设计器生成的类是部分类的(您无需进行其他工作 ),因此您可以在生成的文件旁边创建一个代码文件,其中partial也可以使类型实现接口。

生成的类

public partial class RandomObject1

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

public partial class RandomObject1 : ICommonInterface

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

如:

public partial class RandomObject1: ICommonInterface
{
}

通过“ ICommonInterface”,可以指定共享属性的接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM