1

私はデータの配列を作成しています:

var data = new Data[] { 1, "string", true, //.. }; //In this case, assume that strings and booleans are supported types, but integers are not.

データのセットを保存すると、一連のifステートメントを実行してデータを保存します。

if (data is string) StoreData(data as string);
else if (data is boolean) StoreData(data as boolean);
//..

整数はサポートされていないので、コードで適切に処理する必要があります(ロギングなど)。ただし、2番目、3番目などでサポートされているタイプを引き続き保存できるようにしたいです。

更新:サポートされていないタイプが見つかった後もコードを実行し続けたいのですが、それ以降はサポートされているタイプが保存される可能性があります。

サポートされていないタイプを処理して、後続のサポートされているタイプを保存するにはどうすればよいですか?

4

1 に答える 1

3

暗黙の演算子を使用して、サポートされている型を Data クラスに変換します。サポートされているデータ型に暗黙的な演算子を追加すると、サポートされていない演算子はコンパイルされません。

http://www.codeproject.com/Articles/15191/Understanding-Implicit-Operator-Overloading-in-C

public class Data
{
    private object UnderlyingValue;

    private Data(object underlyingValue)
    {
        this.UnderlyingValue = underlyingValue;
    }

    public static implicit operator Data(string value)
    {
        return new Data(value);
    }

    public static implicit operator Data(bool value)
    {
        return new Data(value);
    }
}

var data = new Data[] { 1, "string", true }; //compiler error on "1" because no supporting conversion method is provided

ジョンが言ったように、あなたの要件は少し曖昧なので、これに他に何を追加すればよいかわかりません. 必要なものに応じて、おそらく Data の汎用バージョンを使用するか、後で Data オブジェクトを管理する方法が異なる場合があります。また、いくつかのファクトリを実行して、サポートされている型を確認し、適切にフォーマットされた例外をスローすることもできます。

編集:編集に基づいて、次のようなことができます:

public class SupportedObjectsResults
{
    public List<object> SupportedObjects { get; private set; }
    public List<object> UnsupportedObjects { get; private set; }

    public SupportedObjectsResults(List<object> supportedObjects, List<object> unsupportedObjects)
    {
        this.SupportedObjects = supportedObjects;
        this.UnsupportedObjects = unsupportedObjects;
    }
}

public static class SupportedTypeHelper
{
    public static SupportedObjectsResults GetSupportedTypes(params object[] values)
    {
        List<object> supportedObjects = new List<object>();
        List<object> unsupportedObjects = new List<object>();

        foreach(object value in values)
        {
            if (CheckIsSupported(value))
                supportedObjects.Add(value);
            else
                unsupportedObjects.Add(value);
        }

        return new SupportedObjectsResults(supportedObjects, unsupportedObjects);
    }

    private static bool CheckIsSupported(object underlyingValue)
    {
        return (underlyingValue is string ||
                underlyingValue is bool
                );
    }
}

次に、サポートされているオブジェクトとサポートされていないオブジェクトを確認できます。

var supportedResults = SupportedTypeHelper.GetSupportedTypes(1, "string", true);
//supportedResults.SupportedObjects = ["string", true]
//supportedREsults.UnsupportedObjects = [1];

余談ですが、2 番目の解決策はあまり好きではありません。たくさんのボックス化があり、コンパイル時のチェックはありません。いずれにせよ、これは特定の設計上の問題を解決するための良いスタートになるはずです。

于 2012-05-16T16:30:38.903 に答える