2013-03-26 3 views
3

Извините за титул, я не могу найти правильный. У меня есть несколько методов, которые возвращают тот же результат.C# передать анонимный параметр?

возвращения типа

public class JsonTreeView 
{ 
    public int id { get; set; } 
    public string text { get; set; } 
    public string state { get; set; } 
    public string @checked { get; set; } 
    public string attributes { get; set; } 
    public List<JsonTreeView> children { get; set; } 
} 

первый метод

List<JsonTreeView> FromReportTree(List<ReportTree> list) 
{ 
} 

второй метод

List<JsonTreeView> FromLocationTree(List<LocationTree> list) 
{ 
} 

и anothers ... свойства моделей дерева различны. например:

LocationTree (id, name, parent, text) 
ReportTree (sno, name, parent, desc) 

Можно ли написать один метод для всех этих древовидных моделей? Любое предложение или отправная точка?

Спасибо ...

+1

Не уверен в правильности методики, но вы могли бы иметь базовый класс, который все «дерево» классы наследуют от и тогда вы могли бы передать список из базовый класс. Не чувствует себя «правильно», но он должен работать. –

+0

TreeModels представлены таблицами DB.Поэтому, если я сделаю ваше предложение, я должен создать дополнительные модели DTO и снова добавить их в таблицы таблиц DB ... –

ответ

2

Я предлагаю вам сделать приватный метод, который делает черновую работу, и держать перегруженные методы для различных типов. Вызов частного метода от других методов, с помощью функции, которая создает JsonTreeView объект из конкретных объектов этого метода:

private List<JsonTreeView> FromReportTree<T>(List<T> list, Func<T, JsonTreeView> convert) { 
    // loop through the list and call convert to create items 
    List<JsonTreeView> result = new List<JsonTreeView>(); 
    foreach (T item in list) { 
    result.Add(convert(item)); 
    } 
    return result; 
} 

List<JsonTreeView> FromReportTree(List<ReportTree> list) { 
    return FromReportTree(list, t => new JsonTreeView(t.id, t.text, ...)); 
} 

List<JsonTreeView> FromReportTree(List<LocationTree> list) { 
    return FromReportTree(list, t => new JsonTreeView(t.sno, t.desc, ...)); 
} 
+0

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

0

Ваш вопрос немного запутанным, но я думаю, что я понимаю. Вам нужна одна функция FromReportTree.

Для этого вам, скорее всего, потребуется, чтобы ReportTree и LocationTree имели общий базовый класс. Как:

public abstract class ReportLocationTree { 
    public int id { get; set; } 
} 

public class ReportTree : ReportLocationTree { 
    public string moreStuff { get; set; } 
} 

public class LocationTree : ReportLocationTree { 
    public string evenMoreStuff { get; set; } 
} 

List<JsonTreeView> FromReportTree(List<ReportLocationTree> list) 
{ 
    list.Select(t => new JsonTreeView { id = t.id }).ToList(); 
} 

Я не был уверен, как вы были serailizing, так что я не включил его в свой код, но это плохая форма следовать другое соглашение об именах на свойствах только потому, что они будучи serailized ,

JSON.Net делает это довольно легко на вас: http://james.newtonking.com/projects/json/help/index.html?topic=html/SerializationAttributes.htm

1

Это зависит от того, что происходит в этих методах. Вы говорите, что различные модели дерева имеют разные свойства; нужна ли логике в методе какие-либо из не общих свойств? Если логика в каждом из этих методов является то же самое, вы можете сделать это:

List<JsonTreeView> FromReportTree<T>(List<T> list) where T : BaseTree 
{ 
    //some logic 
} 

при условии, у вас есть BaseTree модель какой-то, в противном случае T : class или просто оставить, что от (не рекомендуется).

Если логика отличается, вы все равно можете сделать это, выполнив проверку if (list is LocationTree) и используя ее для выполнения логики, специфичной для LocationTree, но это может стать беспорядочным.

0

Если вы сделаете все свои деревья для реализации интерфейса, вы можете.

interface iMyTree 
{ 
    int MyTreeID {get; set;} 
    string MyTreePame {get; set;} 
    object MyTreeParent {get; set;} 
    string MyTreeText {get; set;} 
} 


class AnyTree : iMyTree 
{ 
    //any properties 

    //implements iMyTree 
} 

И этот метод:

List<JsonTreeView> FromMyTree(List<iMyTree> list) 
{ 
    //all trees that implement iMyTree will have the same methods, any kind of tree implementing iMyTree can be used. 
} 
Смежные вопросы