为了争论,我有一个object
。我无法修改我的函数的签名,因为我正在扩展其他人的类。
举一个具体的例子,我有以下内容:
class Foo<T> : SomeBaseClass
{
public override MyFunction(object value)
{
// TODO: Figure out if value is an instance of Foo, though I don't care
// what type was associated with it.
}
}
有没有办法确保value
是Foo
类型的某个实例?
答案 0 :(得分:6)
好吧,如果你想检查它是否完全一个Foo<something>
,这很容易:
Type type = value.GetType();
if (!type.IsGenericType)
{
throw new ArgumentException("Not a generic type");
}
if (type.GetGenericTypeDefinition() != typeof(Foo<>))
{
throw new ArgumentException("Not the right generic type");
}
如果您需要确定它是某种来自Foo<T>
的类型,那就稍微难了 - 因为您不一定知道它在哪里是通用的。例如,它可能是:
class Bar : Foo<string>
或
class Baz<T> : Foo<T>
使事情变得更容易的另一种方法可能是引入另一个非泛型类:
abstract class Foo : SomeBaseClass
class Foo<T> : Foo
然后你可以这样做:
if (value is Foo)
当然,这也允许从Foo
派生的其他类型。在许多情况下,这确实不是问题,但这取决于您的具体情况。您也可以将任何不需要引用T
的成员放入Foo
,这样您就可以在不关心T
的情况下访问它们。
答案 1 :(得分:2)
您可以尝试在value.GetType()
上调用GetGenericTypeDefinition。这基本上会给你Foo<>
或抛出异常。要避免后者,请检查IsGenericType
标志。
答案 2 :(得分:0)
如果你要从基类中重写,我认为你不能这样做。
你可以沿着这些方向做点什么。最大的缺点是你松开了编译时类型检查并将其留给了运行时。
class Foo<T> : SomeBaseClass
{
public override MyFunction(object value)
{
if(value.GetType() != typeof(T))
{
// wrong type throw exception or similar
}
}
}