首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查类是否实现了精确的泛型类定义。

检查类是否实现了精确的泛型类定义。
EN

Stack Overflow用户
提问于 2020-01-18 17:22:50
回答 2查看 71关注 0票数 0

因此,我正在尝试的是创建一个方法,它选择实现泛型类的类型,其特定泛型值只有在运行时才知道。

我试过这样的方法

代码语言:javascript
运行
复制
public bool HasCommand(ITerminal owner)
{
    var genericType = typeof(Command<>).MakeGenericType(owner.GetType());
    var command = typeof(HelloCommand);

    return command.GetInterfaces().Any(x => x.GetGenericTypeDefinition() == genericType 
                                            && x.IsGeneric); 
}

hello命令如下所示

代码语言:javascript
运行
复制
public class HelloCommand : Command<HallTerminal>

但它总是返回假的。任何关于改变/做什么的解决方案。

编辑:命令类如下所示

代码语言:javascript
运行
复制
public class Command<T>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-19 17:58:42

解决了这个问题,但始终出现错误的问题是,Command (在HelloCommand中实现)不是一个干扰,因此总是错误的。

要解决这个问题,你可以

代码语言:javascript
运行
复制
command.BaseType.IsEquivalentTo(genericType)
票数 0
EN

Stack Overflow用户

发布于 2020-01-18 17:32:00

可以使用is运算符检查类是否与给定类型兼容:

代码语言:javascript
运行
复制
public bool HasCommand(Terminal owner)
{ 
    var gType = typeof(Command<>).MakeGenericType(owner.GetType());
    var bType = typeof(HelloCommand);

    if (owner is Command<HallTerminal>) 
    {     

    }
}

举个例子:

代码语言:javascript
运行
复制
public class Person<T>
{
    public int Id { get; set; }            
}

public class Student : Person<Greeting>
{   }

public class StudentWarmGreeting : Person<WarmGreeting>
{   }        

public class Greeting 
{
    public void SayHello()
    {
        Console.WriteLine("Hello, it is Greeting!:)");
    }
}

public class WarmGreeting
{
    public void SayHello()
    {
        Console.WriteLine("Hello, it is WarmGreeting!:)");
    }
}

您可以使用is操作符进行检查:

代码语言:javascript
运行
复制
static void Main(string[] args)
{
    if (studentGreeting is Person<Greeting>)
            Console.WriteLine("person is Greeting");

    if (studentWarmGreeting is Person<WarmGreeting>)
            Console.WriteLine("person is WarmGreeting");

    // Visual Studio is clever and it will say:
    // "The given expression is never of the provided ('Program.Person') type"
    if (studentWarmGreeting is Person<Greeting>)
            Console.WriteLine("person is Greeting");
}

但是,Visual很聪明,它将给我们一个警告:

给定表达式从来不是提供的('Program.Person')类型的

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59803043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档