C# 检查类的类型

C# 检查类的类型,c#,C#,我有以下C#类课程: 知道如何测试回复类型吗?reply.GetType()是您要查找的回复类型。reply.GetType()是您要查找的回复类型您可以使用typeof这是一个返回对象的System.type的操作符 您可以使用typeof,这是一个返回对象的System.Type的操作符 嗯,typeof()只对类型有效(如typeof(int)),而不是变量,因此您需要 reply.GetType() 相反 但是您会发现case表达式需要文字值,因此需要转换为if-else块: pub

我有以下C#类课程:


知道如何测试回复类型吗?

reply.GetType()
是您要查找的回复类型。

reply.GetType()
是您要查找的回复类型

您可以使用
typeof
这是一个返回对象的
System.type
的操作符


您可以使用
typeof
,这是一个返回对象的
System.Type
的操作符

嗯,
typeof()
只对类型有效(如
typeof(int)
),而不是变量,因此您需要

reply.GetType() 
相反

但是您会发现
case
表达式需要文字值,因此需要转换为if-else块:

public static String Evaluate<T>(Reply<T> reply) {
    if(reply.GetType() == typeof(Ok<T>)) {
        // Do something
    }
    else {
     // Other cases  
    }
}  
公共静态字符串求值(回复){
if(reply.GetType()==typeof(Ok)){
//做点什么
}
否则{
//其他情况
}
}  

if(回复正常){
//做点什么
}
否则{
//其他情况
}  
嗯,
typeof()
只对类型(如
typeof(int)
中的类型)有效,而不是变量,因此您需要

reply.GetType() 
相反

但是您会发现
case
表达式需要文字值,因此需要转换为if-else块:

public static String Evaluate<T>(Reply<T> reply) {
    if(reply.GetType() == typeof(Ok<T>)) {
        // Do something
    }
    else {
     // Other cases  
    }
}  
公共静态字符串求值(回复){
if(reply.GetType()==typeof(Ok)){
//做点什么
}
否则{
//其他情况
}
}  

if(回复正常){
//做点什么
}
否则{
//其他情况
}  

您也无法打开类型。您必须直接进行比较,或者可以执行类似于
if(reply is Ok){//do something}
的操作。我还应该注意,在对象类型上执行
开关/case
的情况实际上可能很好地表明,是时候添加一个可重写的方法来reply来执行该操作了。如果您可能需要其他对象类型,那么创建一个共享接口(Interface_CanDoSomethingByCase)。@Katana314我理解您关于重写的建议。。。但在这种情况下,Ok、BadRequest等是服务层中的类。我的评估方法是将这些服务层响应转换为HTTP响应,如500、404、200等。它们并不完全匹配,但我认为在服务层中具有HTTP功能不是一个好的选择,因为我希望它是HTTP不可知的。。。这就是为什么我在服务层使用者上使用这个Evaluate方法(或may扩展)将响应转换为HTTP响应的原因。@Miguel Fair。我从来都不知道如何在好的MVC设计和好的面向对象设计之间发生冲突时,正确地协调它们。你也不能切换类型。您必须直接进行比较,或者可以执行类似于
if(reply is Ok){//do something}
的操作。我还应该注意,在对象类型上执行
开关/case
的情况实际上可能很好地表明,是时候添加一个可重写的方法来reply来执行该操作了。如果您可能需要其他对象类型,那么创建一个共享接口(Interface_CanDoSomethingByCase)。@Katana314我理解您关于重写的建议。。。但在这种情况下,Ok、BadRequest等是服务层中的类。我的评估方法是将这些服务层响应转换为HTTP响应,如500、404、200等。它们并不完全匹配,但我认为在服务层中具有HTTP功能不是一个好的选择,因为我希望它是HTTP不可知的。。。这就是为什么我在服务层使用者上使用这个Evaluate方法(或may扩展)将响应转换为HTTP响应的原因。@Miguel Fair。我从来都不知道如何在好的MVC设计和好的面向对象设计之间发生冲突时正确地协调它们。OP使用的是
typeof
——只是不正确地使用了它。我已经有一段时间没有编写C了,但这不是用来从
类中获取
系统的。Type
实例吗?ie,不是一个实例,而是类结构本身的名称(
System.String
,vs
myStr
)我的错误!这里很早就错过了它。OP正在使用
typeof
-只是使用不正确。我已经有一段时间没有编写C了,但这不是用来获取
系统的。从
类中键入
实例吗?ie,不是一个实例,而是类结构本身的名称(
System.String
,vs
myStr
)我的错误!很早就错过了。is和typeof有什么区别?我想第一种选择更快?也适用于子类,因此如果
reply
是继承自
Ok
的类的实例,则
is
将返回true,而
=
将不返回true。我怀疑在速度上是否有任何显著差异。我不知道
是否为子类工作。我一直在使用typeof(foo)。IsAssignableFrom(typeof(bar))。回答得好!is或typeof之间有什么区别?我想第一种选择更快?也适用于子类,因此如果
reply
是继承自
Ok
的类的实例,则
is
将返回true,而
=
将不返回true。我怀疑在速度上是否有任何显著差异。我不知道
是否为子类工作。我一直在使用typeof(foo)。IsAssignableFrom(typeof(bar))。回答得好!
public static String Evaluate<T>(Reply<T> reply) {
    if(reply.GetType() == typeof(Ok<T>)) {
        // Do something
    }
    else {
     // Other cases  
    }
}  
  if(reply is Ok<T>) {
      // Do something
  }
  else {
      // Other cases
  }