暗黙の演算子を使用して、サポートされている型を 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 番目の解決策はあまり好きではありません。たくさんのボックス化があり、コンパイル時のチェックはありません。いずれにせよ、これは特定の設計上の問題を解決するための良いスタートになるはずです。