[英]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.