2013-09-24 29 views
-2

你好,你能不能帮我减少在C#代码中,我有很多的功能,如这些 我想减少代码与参数的功能一个功能,我将在稍后发送。减少代码与通用委托或以其他方式

public void WriteTransportCurrectCategoryTypes() 
    { 
     var jStr = GetJSONString("GetBusTypes"); 
     var jArr = JArray.Parse(jStr); 
     var tTypes = new List<TransportCurrentCategoryType>(); 
     foreach (dynamic d in jArr) 
     { 
      var tType = new TransportCurrentCategoryType(); 
      ParseTransportCurrentCategoryType(tType, d); 
      tTypes.Add(tType); 
     } 
    } 

    public void WriteBusModelSpecs() 
    { 
     var jStr = GetJSONString("GetBusModelSpecs"); 
     var jArr = JArray.Parse(jStr); 
     var specs = new List<Characteristic>(); 
     foreach (dynamic d in jArr) 
     { 
      var spec = new Characteristic(); 
      ParseBusModelSpecs(spec, d); 
      specs.Add(spec); 
     } 
    } 

我tryed使用委托与通用,但它不是工作

public delegate void ParseParameters<T>(T objectClass,dynamic a); 
    private static void ParceBusClass(BusClass busClass,dynamic a) 
    { 
     busClass.Name = a.Name; 
     busClass.Transport = new TransportCategory {Id = a.BusModelCategoryId}; 
    } 

然后我把它叫做:

 GetCollectionFromJSON<BusClass>("", ParceBusClass); 
     private static List<T> GetCollectionFromJSON<T>(string functionName,      ParseParameters<T> parseFunk){ 
    /****/ 
    parseFunk<T>(busClass, a); 
    /***/ 
    } 

它采用错误,

+0

尝试'T OBJ = JsonConvert.DeserializeObject (jStr)' – I4V

+0

@ I4V我不能这样做,因为我有这样busClass.Transport =新TransportCategory {ID = a.BusModelCategoryId}性能; – Abbath

回答

2

一般情况下,你可以使用以下命令:

public List<T> Write<T>(string name, Func<T> factory, Action<T, dynamic> parser) 
{ 
    var jStr = GetJSONString(name); 
    var jArr = JArray.Parse(jStr); 
    var result = new List<T>(); 
    foreach (dynamic d in jArr) 
    { 
     var item = factory(); 
     parser(item, d); 
     result.Add(item); 
    } 
    return result; 
} 

你会这样称呼它:

Write<Characteristic>(
    "GetBusModelSpecs",() => new Characteristic(), ParseBusModelSpecs); 
Write<TransportCurrentCategoryType>(
    "GetBusTypes",() => new TransportCurrentCategoryType(), 
    ParseTransportCurrentCategoryType); 

如果大多数或所有的类的默认构造函数,可以缩短这个通过提供过载:

public List<T> Write<T>(string name, Action<T, dynamic> parser) 
    where T : new() 
{ 
    return Write<T>(name,() => new T(), parser); 
} 

现在你可以调用它是这样的:

Write<Characteristic>("GetBusModelSpecs", ParseBusModelSpecs); 
Write<TransportCurrentCategoryType>(
    "GetBusTypes" ,ParseTransportCurrentCategoryType); 

这个答案没有考虑到可能存在一个更好的方式使用你的J SON库。有关示例,请参阅I4V的评论。

+0

谢谢,但var item = factory();不工作就写道:“无法解析符号工厂” – Abbath

+0

@Abbath:请确保您完全复制的代码,并没有任何错别字。如果您认为您正确复制了所有内容,请在某处上传截图。 –

+0

遗憾的错误是主要的所有工作正常谢谢:)这是我需要什么 – Abbath

0

factory method解析JSON创建通用的抽象父类Writer

public abstract class Writer<T>   
{ 
    private readonly string _url; 

    public Writer(string url) 
    { 
     _url = url;    
    } 

    public void Write() 
    { 
     var jStr = GetJSONString(_url); 
     var jArr = JArray.Parse(jStr); 
     var tTypes = new List<T>(); 

     foreach (dynamic d in jArr)    
      tTypes.Add(Parse(d));   
     // other logic here    
    } 

    protected abstract T Parse(object d); // implemented by concrete writers 

    private string GetJSONString(string url) 
    { 
     // getting json string here 
    } 
} 

然后创建要处理(他们应该指定装载JSON的URL并重写抽象Parse方法)每种类型concreate子类:

public class TransportCurrectCategoryWriter : Writer<TransportCurrectCategory> 
{ 
    public TransportCurrectCategoryWriter() 
     : base("GetBusTypes") 
    { 
    } 

    protected override TransportCurrectCategory Parse(object d) 
    { 
     // parse TransportCurrectCategory and return parsed instance 
    } 
} 

用法:

var writer = new TransportCurrectCategoryWriter(); 
writer.Write(); 

没有重复的代码。易于阅读和理解。