2016-06-09 4 views
4

Тема может показаться, что этот вопрос уже опубликован, но мой фрагмент кода и проблема разные. Пожалуйста, взгляните на него. У меня есть 20-20 таблиц Sql, из которых я создал свой класс POCO в своем приложении. Каждая из этих таблиц содержит около 4-5 общих столбцов, в которые мне нужно заполнить некоторые записи в приложении, остальные столбцы таблицы уже заполнены данными XML, отправленными каким-либо другим приложением. Только 4-5 общих столбцов каждой таблицы я пытаюсь заполнить приложение, как показано ниже.C# Избегайте повторяющегося кода и используйте Generic

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

Точно так же я написал код для 22 таблиц каждого и эти функции называют, когда я имею дело с этим конкретным набором объекта.

Как создать общий метод, чтобы я мог избавиться от 22 функций, которые имеют повторяющийся код?

Я также размещаю свой информационный класс ниже.

public class Information 
{ 
public List<Software> Software{get;set;} 
public List<Users> Users{get;set;} 
} 

Итак, теперь мой класс «Программное обеспечение и пользователи» выглядит как ниже с реализацией интерфейса ICommonColumns.

public interface ICommonColumns 
{ 
DateTime DCDTime{get;set;} 
DateTime LastModDTime{get;set} 
..... 
and others common fields 
} 

public class Software : ICommonColumns 
{ 
.... 
} 

public class Users : ICommonColumns 
{ 
.... 
} 
+1

Вы можете обобщить все b ut 'foreach (var item in request.Software)' строка довольно легко. У вас может быть общая функция, обрабатывающая все, кроме этой строки, или, возможно, вы можете сделать этот бит с Reflection, но я не уверен, как это будет сделано. – RBarryYoung

+1

Я думаю, что в вашем случае лучший подход состоял бы в том, чтобы извлечь эти поля в другую таблицу, по крайней мере, это то, что я бы сделал, но если вы работаете с устаревшими таблицами, и вы не можете изменить логику, посмотрите на это link, он показывает, как реализовать общий репозиторий: http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle – Spluf

+1

Итак, foreach (var item in request.Software) выглядит для меня проблемой. Как бы я это обобщил? –

ответ

1

Оба Software и Users нужно будет иметь ограничение, чтобы гарантировать, что они имеют нечто общее, такие как interface или базового класса.

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

Например, ваш Software класс будет выглядеть следующим образом:

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); 
+1

Я думаю, что тип 'requestEntities' и возвращаемые типы не совпадают или не имеют тип базового класса. –

+0

Да, они не одинаковы. –

+0

В программном методе, который у вас есть, вы создаете новое «Программное обеспечение», а затем выполните следующее: 'd = item;'. Это похоже на то, что они такой же тип? –

4

Почему бы не реализовать интерфейс POCO и создать метод, допускающий реализацию этого интерфейса?

Edit:

public interface ISomething 
{ 
    public DateTime DCDTime { get; set; } 
    public DateTime LastModDTime { get; set; } 
    public int ID { get; set; } 
    public DateTime ScanDateTime { get; set; } 
    public int SrNo { get; set; } 
} 
    private IEnumerable<T> GetSoftwareEntityData<T>(Information request, DateTime scanDateTime, Func<Information, T> someCollection) 
    where T : ISomething 
    { 
    int SrNo = 0; 

    foreach (var item in someCollection(request)) 
    { 
     item.DCDTime = DateTime.Now; 
     item.LastModDTime = scanDateTime; 
     item.ID = request.Id; 
     item.ScanDateTime = scanDateTime; 
     item.SrNo = ++SrNo; 

     yield return item; 
    } 
} 
+0

Выглядит отлично. Не могли бы вы разместить образец на моем примере с помощью общего примера. –

Смежные вопросы