2

構成ファイルからロードされた値を保持するために使用されるクラスがあります。このクラスを使いやすくするために、いくつかの基本型への多くの暗黙的な変換を設定しました。

変換したい型の 1 つは IEnumerable(T) です。たとえば、プログラマーが構成ファイルにこのような値を持っている場合

a = "1,2,3,4"

C# コードでは、次のように記述できます。

IEnumerable<int> a = Config.a;

理想的には私が書きたいのはこれです

    public static implicit operator IEnumerable<T>(ConfigurationValue val)
    {
        string value = val;

        string[] parts = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

        List<T> convertedTypes = new List<T>();

        foreach (string part in parts)
        {
            T converted = Convert.ChangeType(part.Trim(), typeof(T));
            convertedTypes.Add(converted);
        }

        return convertedTypes;
    }

しかし、これは T が定義されていないという構文エラーを私に与えています。そのような変換を定義する方法はありませんか、それとも特別な構文がありますか?

また、記録のために、.Net Framework 4.0 で C# 4.0 を使用しています。

4

3 に答える 3

8

しかし、これは T が定義されていないという構文エラーを私に与えています。そのような変換を定義する方法はありませんか、それとも特別な構文がありますか?

ジェネリック演算子を宣言しようとしていますが、これは C# ではサポートされていません。(IL でサポートされているかどうかはわかりません。) コンストラクター、プロパティ、イベント、およびファイナライザーについても同様です。

基本的に、ジェネリックにできるのはメソッドと型だけです。

編集:コメントに記載されているように、代わりに汎用メソッドを記述します。ユーザー定義の変換、特に暗黙的な変換は、非常に慎重に使用する必要があります.IMO.

于 2013-06-19T13:46:57.757 に答える
4

ジェネリック演算子(@Jonが述べたように不可能です)の代わりに、拡張メソッドを作成できます:

public static IEnumerable<T> AsEnumerable<T>(this string value)
{
    if (String.IsNullOrEmpty(value))
        yield break;

    var parts = value.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries);

    foreach (string part in parts)
        yield return Convert.ChangeType(part.Trim(), typeof(T));
}

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

IEnumerable<int> a = Config.a.AsEnumerable<int>();
于 2013-06-19T13:51:33.650 に答える
2

Jon Skeet が述べたように、ジェネリック演算子はサポートされていませんが、代わりにジェネリック拡張メソッドにすることができます。

public static class ConfigurationExtensions
{
    public IEnumerable<T> GetValues<T>(this ConfigurationValue val)
    {
        string value = val.Value;

        string[] parts = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

        List<T> convertedTypes = new List<T>();

        foreach (string part in parts)
        {
            T converted = (T)Convert.ChangeType(part.Trim(), typeof(T));
            convertedTypes.Add(converted);
        }

        return convertedTypes;
    }
}
于 2013-06-19T13:51:27.577 に答える