英文:
How do I check if a generic parameter is of a specific type?
问题
我可以做到这一点
private static void Execute<T>(IList<T> points, ...) where T : Point2D
{
if (typeof(T) == typeof(Point3D)) // 仅限 Point3D
{
但我想检查 Point3D
和所有派生类型,类似于:
private static void Execute<T>(IList<T> points, ...) where T : Point2D
{
if (T is Point3D) // Point3D 及其派生类型
{
但我得到:错误 CS0119:“T”是一种类型,在给定的上下文中无效
Point3D
类继承自 Point2D
。有办法实现这个吗?
英文:
I can do this
private static void Execute<T>(IList<T> points, ...) where T : Point2D
{
if (typeof(T) == typeof(Point3D)) // Point3D only
{
but I would like to check against Point3D
and all derived types, something like:
private static void Execute<T>(IList<T> points, ...) where T : Point2D
{
if (T is Point3D) // Point3D ans derived types
{
but I get: Error CS0119: 'T' is a type, which is not valid in the given context
Point3D
class inherits from Point2D
one.
Is there any way to accomplish this?
答案1
得分: 3
你可以使用 Type.IsAssignableTo
/Type.IsAssignableFrom
中的一个:
IsAssignableTo
- 确定当前类型是否可以分配给指定目标类型的变量。
IsAssignableFrom
- 确定是否可以将指定类型 c 的实例分配给当前类型的变量。
if (typeof(T).IsAssignableTo(typeof(Point3D)))
请注意,IsAssignableTo
是在 .NET 5 中引入的,因此对于较早的框架版本,您需要使用“reverse”:
if (typeof(Point3D).IsAssignableFrom(typeof(T)))
英文:
You can use one of the Type.IsAssignableTo
/Type.IsAssignableFrom
:
> IsAssignableTo
- Determines whether the current type can be assigned to a variable of the specified targetType.
> IsAssignableFrom
- Determines whether an instance of a specified type c can be assigned to a variable of the current type.
if(typeof(T).IsAssignableTo(typeof(Point3D)))
Note that IsAssignableTo
was introduced in .NET 5, so for earlier framework version you need to use the "reverse":
if(typeof(Point3D).IsAssignableFrom(typeof(T)))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论