【发布时间】:2011-12-31 12:01:52
【问题描述】:
这与我之前的问题C# Generic List conversion to Class implementing List<T>有关
我有以下代码:
public abstract class DataField
{
public string Name { get; set; }
}
public class DataField<T> : DataField
{
public T Value { get; set; }
}
public static List<DataField> ConvertXML(XMLDocument data) {
result = (from d in XDocument.Parse(data.OuterXML).Root.Decendendants()
select new DataField<string>
{
Name = d.Name.ToString(),
Value = d.Value
}).Cast<DataField>().ToList();
return result;
}
这可行,但是我希望能够将 LINQ 查询的选择部分修改为如下所示:
select new DataField<[type defined in attribute of XML Element]>
{
Name = d.Name.ToString(),
Value = d.Value
}
这只是一个糟糕的方法吗?可能吗?有什么建议吗?
【问题讨论】:
-
我觉得你永远不会知道你有什么 DataField 的子类,所以为什么不直接使用
class DataField{string name; object value;}呢? -
我真的不想将所有值都引用为对象。如果我要采取类似的方法,使用 class DataField{string name; 似乎更容易。字符串类型;字符串值}。
-
当然可以,但是每次使用前您都必须解析数据。如果您将数据预先解析为对象,然后将它们存储在数据字段中,则可以在准备使用它们时进行转换。这就是 ADO.NET 对 DataReader 所做的事情(尽管 DataReader 会延迟解析的执行,直到需要列值为止)。例如,
if(myField.Value is DateTime { /* do that date thing */ }或if(myField.Name == "importantDateThing") { var date = (DateTime)myField.Value; /* do importanty date thing */ } -
@xixonia....是的,我明白这一点。但是这样的铸造对我来说感觉不对。我知道类型并且有能力构建不同类型的列表。
-
事情是这样的,你还是要投。您要么检查 DataField
的类型并进行强制转换,要么检查对象的类型并进行强制转换。
标签: c# generics linq-to-xml