0

次のことを実行できるメソッドを作成しようとしています。

string? s = xelement.GetValue < string > ( "elementname" );
Guid? g = xelement.GetValue < Guid > ( "elementname" );
int? i = xelement.GetValue < int > ( "elementname" );
DateTime? d = xelement.GetValue < DateTime > ( "elementname" );

出来ますか?

4

4 に答える 4

3

残念ながら、2 つの別々のメソッドを作成する必要があります。を返すには、参照型を使用できないようにする制約Nullable<T>が必要です。struct

于 2013-06-28T12:16:23.603 に答える
1

この拡張メソッドを試すと、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);
}
于 2013-06-28T12:21:52.693 に答える
0

これをLinqPad(私の頼りになるクイックC#サンドボックス)でテストしたところ、動作しました:

    void Main()
{
    string s = GetValue<string>("elementname");
    Guid? g = GetValue<Guid?>("elementname");
    Guid h = GetValue<Guid>("elementname");
    int? i = GetValue<int?>("elementname");
    int j = GetValue<int>("elementname");
    DateTime? d = GetValue<DateTime?>("elementname");
    DateTime e = GetValue<DateTime>("elementname");

    Console.WriteLine(s);
    Console.WriteLine(g);
    Console.WriteLine(h);
    Console.WriteLine(i);
    Console.WriteLine(j);
    Console.WriteLine(d);
    Console.WriteLine(e);
}

T GetValue<T>(string elementName)
{
    return default(T);
}

出力:

null 
null 
00000000-0000-0000-0000-000000000000
null 
0
null 
1-1-0001 00:00:00
于 2013-06-28T12:25:35.700 に答える