1. ホーム
  2. c#

文字列から<T>への変換

2023-11-17 07:28:23

質問

本当はもらえるはずなのですが、聞いた方が楽かなぁと思う程度です。

C#の関数で。

public static T GetValue<T>(String value) where T:new()
{
   //Magic happens here
}

マジックに適した実装は?この背後にあるアイデアは、私がパースするxmlを持っていて、望ましい値はしばしばプリミティブ(bool、int、stringなど)であり、これはジェネリックを使用するのに最適な場所です... しかし、簡単な解決策は、今のところ私を遠ざけています。

パースする必要がある xml のサンプルは以下のとおりです。

<Items>
    <item>
        <ItemType>PIANO</ItemType>
        <Name>A Yamaha piano</Name>
        <properties>
            <allowUpdates>false</allowUpdates>
            <allowCopy>true</allowCopy>
        </properties>   
    </item>
    <item>
        <ItemType>PIANO_BENCH</ItemType>
        <Name>A black piano bench</Name>
        <properties>
            <allowUpdates>true</allowUpdates>
            <allowCopy>false</allowCopy>
            <url>www.yamaha.com</url>
        </properties>
    </item>
    <item>
        <ItemType>DESK_LAMP</ItemType>
        <Name>A Verilux desk lamp</Name>
        <properties>
            <allowUpdates>true</allowUpdates>
            <allowCopy>true</allowCopy>
            <quantity>2</quantity>
        </properties>
    </item>
</Items>

どのように解決するのですか?

XML を自分でパースするのではなく、XML からクラスへのデシリアライズを行うクラスを作成することをお勧めします。私なら 強く bendeweyの答えに従うことをお勧めします。

しかし、もしこれができないのであれば、希望はあります。あなたは Convert.ChangeType .

public static T GetValue<T>(String value)
{
  return (T)Convert.ChangeType(value, typeof(T));
}

そして、以下のように使用します。

GetValue<int>("12"); // = 12
GetValue<DateTime>("12/12/98");