Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#避免重复代码并使用泛型_C#_Generics - Fatal编程技术网

C#避免重复代码并使用泛型

C#避免重复代码并使用泛型,c#,generics,C#,Generics,主题可能看起来像这个问题已经发布了,但我的代码片段和问题是不同的。 请看一看。 我有大约20到22个Sql表,我已经在我的应用程序中创建了我的POCO类。每个表都有一些4-5个公共列,我需要在应用程序中填充一些记录,表的其余列已经由其他应用程序发送的XML数据填充。下面是我试图在应用程序中填写的每个表中仅有的4-5个公共列 private List<Software> GetSoftwareEntityData(Information request, DateTime scanDa

主题可能看起来像这个问题已经发布了,但我的代码片段和问题是不同的。 请看一看。 我有大约20到22个Sql表,我已经在我的应用程序中创建了我的POCO类。每个表都有一些4-5个公共列,我需要在应用程序中填充一些记录,表的其余列已经由其他应用程序发送的XML数据填充。下面是我试图在应用程序中填写的每个表中仅有的4-5个公共列

private List<Software> GetSoftwareEntityData(Information request, DateTime scanDateTime)
{
    List<Software> Data = new List<Software>();
    int SrNo = 0;
    foreach (var item in request.Software)
    {
        Software d = new Software();
        d = item;
        d.DCDTime = DateTime.Now;
        d.LastModDTime = scanDateTime;
        d.ID = request.Id;
        d.ScanDateTime = scanDateTime;
        d.SrNo = ++SrNo;
        Data.Add(d);
    }
    return Data;
}

private List<Users> GetUsersEntityData(Information request, DateTime scanDateTime)
{
    List<Users> Data = new List<Users>();
    int SrNo = 0;
    foreach (var item in request.Users)
    {
        Users d = new Users();
        d = item;
        d.DCDTime = DateTime.Now;
        d.LastModDTime = scanDateTime;
        d.ID = request.Id;
        d.ScanDateTime = scanDateTime;
        d.SrNo = ++SrNo;
        Data.Add(d);
    }
    return Data;
}

为什么不让POCO实现一个接口并创建一个接受该接口实现的方法呢

编辑:

公共接口
{
公共日期时间DCDTime{get;set;}
公共日期时间LastModDTime{get;set;}
公共int ID{get;set;}
公共日期时间扫描日期时间{get;set;}
公共int SrNo{get;set;}
}
private IEnumerable GetSoftwareEntityData(信息请求、DateTime scanDateTime、Func someCollection)
T:什么东西
{
int SrNo=0;
foreach(someCollection(请求)中的var项)
{
item.DCDTime=DateTime.Now;
item.LastModDTime=扫描时间;
item.ID=request.ID;
item.ScanDateTime=ScanDateTime;
item.SrNo=++SrNo;
收益回报项目;
}
}

软件
用户
都需要有一个约束,以确保他们有共同点,例如
接口
或基类

public class BaseEntity
{
    public DateTime DCDTime { get; set; }
    public DateTime LastModDTime { get; set; }
    public DateTime ScanDateTime { get; set; }
    public int ID { get; set; }
    public int SrNo { get; set; }
}
例如,您的
软件
类将如下所示:

public class Software : BaseEntity
{
    //Some more properties
}
private IEnumerable<TEntity> GetEntityData<TEntity>(int requestId, IEnumerable<TEntity> requestEntities, DateTime scanDateTime)
    where TEntity : BaseEntity, new()
{
    int SrNo = 0;

    foreach (var item in requestEntities)
    {
        TEntity d = new TEntity();
        d = item;
        d.DCDTime = DateTime.Now;
        d.LastModDTime = scanDateTime;
        d.ID = requestId;
        d.ScanDateTime = scanDateTime;
        d.SrNo = ++SrNo;

        yield return item;
    }
}
IEnumerable<Software> softwares = GetEntityData<Software>(request.Id, request.Software, DateTime.Now);
IEnumerable<Users> users = GetEntityData<Users>(request.Id, request.Users, DateTime.Now);
然后您可以创建一个通用方法,如下所示:

public class Software : BaseEntity
{
    //Some more properties
}
private IEnumerable<TEntity> GetEntityData<TEntity>(int requestId, IEnumerable<TEntity> requestEntities, DateTime scanDateTime)
    where TEntity : BaseEntity, new()
{
    int SrNo = 0;

    foreach (var item in requestEntities)
    {
        TEntity d = new TEntity();
        d = item;
        d.DCDTime = DateTime.Now;
        d.LastModDTime = scanDateTime;
        d.ID = requestId;
        d.ScanDateTime = scanDateTime;
        d.SrNo = ++SrNo;

        yield return item;
    }
}
IEnumerable<Software> softwares = GetEntityData<Software>(request.Id, request.Software, DateTime.Now);
IEnumerable<Users> users = GetEntityData<Users>(request.Id, request.Users, DateTime.Now);
private IEnumerable GetEntityData(int-requestId、IEnumerable-requestEntities、DateTime scanDateTime)
其中tenty:BaseEntity,new()
{
int SrNo=0;
foreach(requestEntities中的var项)
{
tenty d=新tenty();
d=项目;
d、 DCDTime=DateTime.Now;
d、 LastModDTime=扫描时间;
d、 ID=请求ID;
d、 ScanDateTime=ScanDateTime;
d、 SrNo=++SrNo;
收益回报项目;
}
}
这样称呼它:

public class Software : BaseEntity
{
    //Some more properties
}
private IEnumerable<TEntity> GetEntityData<TEntity>(int requestId, IEnumerable<TEntity> requestEntities, DateTime scanDateTime)
    where TEntity : BaseEntity, new()
{
    int SrNo = 0;

    foreach (var item in requestEntities)
    {
        TEntity d = new TEntity();
        d = item;
        d.DCDTime = DateTime.Now;
        d.LastModDTime = scanDateTime;
        d.ID = requestId;
        d.ScanDateTime = scanDateTime;
        d.SrNo = ++SrNo;

        yield return item;
    }
}
IEnumerable<Software> softwares = GetEntityData<Software>(request.Id, request.Software, DateTime.Now);
IEnumerable<Users> users = GetEntityData<Users>(request.Id, request.Users, DateTime.Now);
IEnumerable softwares=GetEntityData(request.Id、request.Software、DateTime.Now);
IEnumerable users=GetEntityData(request.Id、request.users、DateTime.Now);

除了
foreach(request.Software中的var项)之外,您可以非常轻松地泛化所有代码行。你可以用一个泛型函数来处理除了那一行以外的所有内容,或者你也可以用反射来处理这一点,但我不确定该怎么做。我认为在你的情况下,最好的方法是将这些字段提取到另一个表中,至少我会这么做,但是,如果您使用的是遗留表,并且无法更改逻辑,那么看看这个链接,它将展示如何实现一个通用存储库:因此foreach(request.Software中的var项)对我来说是一个挑战。我该怎么概括呢?foreach mackes很难。我怀疑在这里使用泛型是否合适。这样可以节省一些代码,但会增加复杂性。就我个人而言,我会接受复制品我想你能解释一下这是怎么回事吗<代码>用户d=新用户();d=项目在您的示例中?创建一个新的
用户
并覆盖该对象没有意义..看起来很棒。请您在我的示例上发布一个带有通用示例的示例。我认为
requestEntities
类型和返回的类型不相同或不共享基类类型。是的,它们与您拥有的软件方法不同,您正在实例化一个新的
软件
,然后执行此操作:
d=item。这看起来像是相同的类型?
其中tenty:BaseEntity
确保传入的任何类型参数都必须继承自
BaseEntity
,这允许您访问属性,例如
DCDTime
ID
<这里实际上不需要code>new()
,所以我将删除它。@MikeEason我如何迭代requestEntities并返回一组新的IEnumerable。如果你能在我的代码中看到,我有这样的东西。