通常、オブジェクトがこれらのタイプのいずれかであるかどうかを確認する場合は、次のコードを使用します。
object a = "ABC";
if (a is string || a is int || a is double)
{
}
次のような、これを短縮する拡張メソッドを作成したいと思います。
if (a.IsOneOfTheseType(string, int, double)
{
}
通常、オブジェクトがこれらのタイプのいずれかであるかどうかを確認する場合は、次のコードを使用します。
object a = "ABC";
if (a is string || a is int || a is double)
{
}
次のような、これを短縮する拡張メソッドを作成したいと思います。
if (a.IsOneOfTheseType(string, int, double)
{
}
これを試して:
public static class ObjectExtensions {
public static bool IsOneOfTypes(this object o, params Type[] types) {
Contract.Requires(o != null);
Contract.Requires(types != null);
return types.Any(type => type == o.GetType());
}
}
ばかげた間違いをテスト/チェックするのに便利なコンパイラはありませんが、これでかなり近づくはずです。これは、「オブジェクトが[特定の]タイプの1つであるかどうかを確認する」という要件を満たすことに注意してください。代入可能性を確認したい場合は、ラムダ式を
type => type.IsAssignableFrom(o.GetType())
正確なセマンティクスについては、 Type.IsAssignableFromを参照してください。
使用するには:
object a = "ABC";
bool isAStringOrInt32OrDouble =
a.IsOneOfTypes(typeof(string), typeof(int), typeof(double));
また
object a = "ABC";
bool isAStringOrInt32OrDouble =
a.IsOneOfTypes(new[] { typeof(string), typeof(int), typeof(double) });