美好的一天,
我有一个用于存储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
答案 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?>
。