2012-12-06 184 views
1

好日子,铸造/拆箱泛型类型

我有一个用来存储类型T的值,我不知道是什么类型是什么,直到运行时的类。我想解开/投射,不知道什么是正确的术语,一个特定的类型(在这种情况下是一个可为空的十进制)回到类型对象。

请原谅我的代码布局:

类片段:

public abstract class Types 
    { 
     public class ValueField<T> 
     { 
      [XmlAttribute] 
      public int TemplateID { get; set; } 

      [XmlAttribute] 
      public int FieldID { get; set; } 

      [XmlIgnore] 
      [ScriptIgnore] 
      public TemplateApprovalField Field { get; set; } 

      [XmlIgnore] 
      [ScriptIgnore] 
      public InstanceTemplateActivityValues Values { get; set; } 

      [XmlAttribute] 
      public T Value { get; set; } 
     } 
    } 

功能片段:

我停留在该行“values.Add((Types.ValueField)场);“,不知道如何施展它。那时,var字段是一个Types.ValueField。

Values = new Func<XmlDocument, List<Types.ValueField<object>>>(xml => 
{ 
    List<Types.ValueField<object>> values = new List<Types.ValueField<object>>(); 

if (xml != null) 
{ 
    foreach (XmlNode node in xml.SelectNodes("//Field")) 
    { 

    if (node.Attributes["Type"].Value == "Numeric") 
     { 
     var field = new Types.ValueField<decimal?>() 
     { 
      Field = ApprovalFields.Find(f => f.FieldID == int.Parse(node.Attributes["ID"].Value)), 
      FieldID = int.Parse(node.Attributes["ID"].Value), 
      TemplateID = int.Parse(node.SelectSingleNode("../@ID").Value) 
     }; 
     field.Value = new Func<string, decimal?>(val => 
      { 
      if (string.IsNullOrEmpty(val)) 
       return null; 
      else 
      { 
       decimal parsed = 0; 
       if (decimal.TryParse(val, out parsed)) 
       return parsed; 
      } 
      return null; 
     })(node.InnerText); 


     values.Add((Types.ValueField<object>)field); //This is where my problem occurs... 
    } 
} 


} 
    return values; 
    })(row["Form_Values"] != DBNull.Value ? 
     new XmlDocument() { InnerXml = row["Form_Values"].ToString() } : null) 

任何输入将不胜感激。

问候 YP

回答

4

你要创建一个ValueField<decimal?>不是 a ValueField<object> - 您的ValueField<T>类不是T中的协变,并且不可以。 (类不能被协变,你的API包括T“在”位置太。)

为了说明为什么这不得工作:

Value<decimal?> foo = new Value<decimal?>(); 
Value<object> bar = foo; // Imagine this worked 
bar.Value = "hello"; 
decimal? x = foo.Value; 

你会想到做?除了第二行以外的所有内容都是无可厚非的,所以我们必须使第二行失败,它会这样做。

这里的简单答案是首先创建一个Value<object>,而不是Value<decimal?>

+0

这很有道理,感谢您的快速响应。会很快检查。 –

+1

你住在哪里,以便我可以给你一个大胖嘴巴开口...... :)谢谢你的好解释。固定。 –