この拡張メソッドを試すと、string、int、および DateTime で機能します。これらの型はすべてIConvertable
インターフェイスでサポートされているためです。したがって、文字列を bool、byte、char、decimal などに変換できます (Guid を除く)。
public static T GetValue<T>(this XElement element, string name)
{
string value = (string)element.Element(name);
return (T)Convert.ChangeType(value, typeof(T));
}
ところでNullable<string>
、nullable は値型のみを受け入れることができるため、C# にはありません。したがって、単純な文字列を使用する必要があります。
使用法:
<rooot>
<string>hello</string>
<int>42</int>
<guid>0FFF30ED-0C4B-41ED-9CDA-D9E084FAD6F2</guid>
<date>06/27/2013</date>
</rooot>
解析:
XDocument xdoc = XDocument.Load(path_to_xml);
XElement root = xdoc.Root;
string s = root.GetValue<string>("string");
int? i = root.GetValue<int>("int");
DateTime? d = root.GetValue<DateTime>("date");
GUID もサポートする必要がある場合は、手動で解析できます。
public static T GetValue<T>(this XElement element, string name)
{
string value = (string)element.Element(name);
Type targetType = typeof(T);
if (targetType == typeof(Guid))
return (T)(object)Guid.Parse(value);
var typeConverter = TypeDescriptor.GetConverter(targetType);
if (typeConverter == null || !typeConverter.CanConvertFrom(typeof(string)))
return default(T); // or throw exception
return (T)typeConverter.ConvertFrom(value);
}
更新OK、メソッドから null 許容値を返したい場合は、(文字列は値型ではないため、メソッドを でパラメータ化できないことに注意してくださいstring
):
public static Nullable<T> GetValue<T>(this XElement element, string name)
where T : struct
{
string value = (string)element.Element(name);
if (value == null)
return null;
Type targetType = typeof(T);
if (targetType == typeof(Guid))
return (T)(object)Guid.Parse(value);
var typeConverter = TypeDescriptor.GetConverter(targetType);
if (typeConverter == null || !typeConverter.CanConvertFrom(typeof(string)))
return null; // or throw exception
return (T)typeConverter.ConvertFrom(value);
}