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

4

1 回答 1

4

您正在创建一个ValueField<decimal?>. 那不是ValueField<object>- 你的课程ValueField<T>不是协变的T,也不可能是。(类不能是协变的,并且您的 APIT也包含在“in”位置。)

为了证明为什么这不能工作:

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

你希望它做什么?第二行以外的一切都无可非议,所以我们必须让第二行失败,它确实做到了。

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

于 2012-12-06T07:12:32.333 回答