C#如何传递匿名参数?

3

对不起,标题写得不太准确,我找不到正确的标题。我有多种方法可以返回相同的结果。

返回类型

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

而其他树模型的属性则不同。例如:

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

是否有可能编写一个适用于所有这些树模型的方法?有什么建议或起点吗?

谢谢...


1
不确定技术的正确性,但您可以拥有一个基类,所有“树”类都继承自该基类,然后您可以传递基类的列表。感觉不太对,但应该可以工作。 - James Culshaw
TreeModels被表示为数据库表格。因此,如果我采用您的建议,我应该创建额外的DTO模型,并再次将它们转换为DB表格模型... - AliRıza Adıyahşi
4个回答

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

1
这取决于那些方法中发生了什么。你说各种树模型具有不同的属性;那么方法中的逻辑是否需要使用非共同属性?如果这些方法中的逻辑相同,可以这样做:
List<JsonTreeView> FromReportTree<T>(List<T> list) where T : BaseTree
{
    //some logic
}

假设您有某种类型的BaseTree模型,否则T : class或者只需省略它(不推荐)。
如果逻辑不同,您仍然可以通过检查 if (list is LocationTree) 并使用该检查来执行特定于LocationTree的逻辑来完成操作,但这可能会变得混乱。

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

我不确定你是如何进行序列化的,所以我在我的代码中没有包含它,但是因为它们正在被序列化,按照不同的命名约定跟随是不好的形式。

JSON.Net让这变得非常容易:http://james.newtonking.com/projects/json/help/index.html?topic=html/SerializationAttributes.htm


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接