0

型が1つの型または別の型のいずれかになることができる型制約を置く方法はありますか?

そんな感じ:

    public void ParseXML<T>(T param) where T : XElement or T : string

編集:

あなたの答えによると(それらに感謝します)、私はこのルートに行くと思います:

public void ParseXML(XElement param)
{
    this.parseXML(param)
}

public void ParseXML(string param)
{
    this.parseXML(param)
}

public void parseXML(object param)
{
    var paramXElement = param as XElement;
    var paramString = param as paramString;
    ...
    <common proccess on param>
    ...
    <specific process on paramXElement> [if not null]
    <specific process on paramString> [if not null]
    ...

}
4

5 に答える 5

2

2 つのオーバーロードを作成するだけです。

public void ParseXML(XElement param);
public void ParseXML(string param);

ここのポイントがわかりませんT

文字列メソッドが文字列で XML を取得することにXElementなっている場合は、コードを複製しないように、そのメソッドでそれを でラップし、もう一方のメソッドを呼び出すようにします。

于 2013-06-05T08:27:53.853 に答える
2

不可能です。関数内で 1 つのタイプと別のタイプをどのように区別しますか? それでも、おそらく型チェックと特殊化を行う必要があり、ジェネリックメソッドの目的が無効になります。

2 つの異なる可能性がある場合は、2 つの特殊なオーバーロードを提供するのが最も簡単です。

public void ParseXml(string val)
public void ParseXml(XElement element)

それが理にかなっていれば、おそらく他のタイプのジェネリックバージョンです。

于 2013-06-05T08:23:57.970 に答える
1

あなたは本当にこれを行うことはできません.

私が提案するのは、XElementのみによって制約しexplicit、そのクラスに演算子を提供することです。詳細については、このリンクstringを参照してください。

于 2013-06-05T08:24:31.707 に答える
1

いいえ、できません。次の 2 つのオプションがあります。

1)ParseXML()サポートされている型ごとに 1 つずつ、2 つの のオーバーロードを記述します。もはや一般的ではありません。

2) 制約はありませんが、実行時に型をテストします。この場合、objectジェネリックの代わりに以下を使用します。

public void ParseXML(object param)
{
    var asString = param as string;

    if (asString != null)
    {
        // Do something with string.
        return;
    }

    var asXElement = param as XElement;

    if (asXElement != null)
    {
        // Do something with XElement.
        return;
    }

    // Error handling.
}

実行時エラーの可能性を回避できるため、明らかに最初のアプローチの方が優れています。

于 2013-06-05T08:24:50.107 に答える
1

いいえ、できません。

文字列を受け入れるオーバーロードを作成し、それをラップしてXElementから、呼び出しを実際のメソッドに委任する必要があります

于 2013-06-05T08:25:05.017 に答える