2016-08-21 66 views
0

我有一个接收动态对象和类型为字符串的函数。 我想将对象转换为我的字符串中的类型。C# - 发送类型作为参数并返回基于它的类型

public void PostAutomaticRule(dynamic automaticRuleObject, string ruleType) 
     { 
      switch (ruleType) 
      { 
       case "Increase_budget": 
        ConvertToAutomaticRule(typeof(IncreaseBudgetRule), ref automaticRuleObject); 
        break; 
      } 
     } 


private void ConvertToAutomaticRule<T>(Type type, ref dynamic ruleObject) 
     { 
      var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
      var json = serializer.Serialize(ruleObject); 
      var c = serializer.Deserialize<type>(json); 
     } 

我想转换为等级:

public class IncreaseBudgetRule 
    { 
     public string automaticRuleName { get; set; } 
     public string givePrioity { get; set; } 
    } 

我有很多的规则类型,所以我想这个函数接收类型和对象,并返回我送类型的对象在函数中。 我该怎么做到这一点?

+0

ConvertToAutomaticRule有一个未使用的泛型参数。我认为那是你需要的。 –

回答

2

你并不需要在你的ConvertToAutomaticRule法的类型。你在那里定义了一个可以用作结果类型的通用参数。作为反序列化,方法也接受一个通用的参数,你可以重写你的方法是这样的:

public void PostAutomaticRule(dynamic automaticRuleObject, string ruleType) 
{ 
    switch (ruleType) 
    { 
     case "Increase_budget": 
      ConvertToAutomaticRule<IncreaseBudgetRule>(ref automaticRuleObject); 
      break; 
    } 
} 


private void ConvertToAutomaticRule<T>(ref dynamic ruleObject) 
{ 
    var serializer = new JavaScriptSerializer(); 
    var json = serializer.Serialize(ruleObject); 
    var c = serializer.Deserialize<T>(json); 
} 

编辑(返回而不是使用REF):

您也可以使用通用的参数设置为作为返回类型。

public void PostAutomaticRule(dynamic automaticRuleObject, string ruleType) 
{ 
    switch (ruleType) 
    { 
     case "Increase_budget": 
      var increasedBudgetRule = ConvertToAutomaticRule<IncreaseBudgetRule>(automaticRuleObject); 
      break; 
    } 
} 


private T ConvertToAutomaticRule<T>(dynamic ruleObject) 
{ 
    var serializer = new JavaScriptSerializer(); 
    var json = serializer.Serialize(ruleObject); 
    return serializer.Deserialize<T>(json); 
} 
+0

如何返回此对象而不是使用void和ref? –

+0

请参阅我的编辑更新示例,而不使用参考 – Mark

+0

谢谢@Mark,您为什么认为有人投下了这个问题? –

0

试图改变自己的泛型接口,这样你可以这样做:

var JsonSerializerSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; 

      var deserializedObject = JsonConvert.DeserializeObject<IYourAutoSerializedObject>(automaticRuleObject.ToString(), JsonSerializerSettings); 
相关问题