转换/拆箱通用类型

时间:2012-12-06 07:08:10

标签: c#

美好的一天,

我有一个用于存储Type T值的类,我不知道在运行之前该类型是什么。我想unbox / cast,不确定正确的术语是什么,一个特定的类型(在这种情况下是一个可以为空的十进制)回到类型对象。

请原谅我的代码布局:

课程片段:

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)field);”,不知道如何施放它。那时,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

1 个答案:

答案 0 :(得分:4)

您正在创建ValueField<decimal?>不是 ValueField<object> - 您的ValueField<T>类在T中不是协变的,而且不可能。 (类不能协变,而且您的API也会在“in”位置包含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?>