C# value.GetType().IsSubClassOf(ClassBase)给我一个错误';ClassBase';是一种类型,在给定上下文中无效;
因此,在将属性存储到备份字段之前,我尝试检查属性是否派生自基类。但是,我得到以下语法错误:C# value.GetType().IsSubClassOf(ClassBase)给我一个错误';ClassBase';是一种类型,在给定上下文中无效;,c#,reflection,C#,Reflection,因此,在将属性存储到备份字段之前,我尝试检查属性是否派生自基类。但是,我得到以下语法错误:“ClassBase”是一个类型,在给定上下文中对行值无效。IsSubclassOf(ClassBase),这没有意义,因为ClassBase是一个类型,而IsSubclassOf需要一个类型 MCV示例如下 using System; namespace QuestionIsSubClassOf { class Program { static void Main(str
“ClassBase”是一个类型,在给定上下文中对行值无效。IsSubclassOf(ClassBase)
,这没有意义,因为ClassBase是一个类型,而IsSubclassOf需要一个类型
MCV示例如下
using System;
namespace QuestionIsSubClassOf
{
class Program
{
static void Main(string[] args)
{
var DataStorageClass = new DataStorageClass();
var DerivedClassA = new ClassDedrivedA();
DataStorageClass.TypeOfClassBase = DerivedClassA.GetType();
}
}
public class DataStorageClass
{
private Type _typeOfClassBase;
public Type TypeOfClassBase
{
get { return _typeOfClassBase; }
set
{
if (value.IsSubclassOf(ClassBase))
{
_typeOfClassBase = value.GetType();
}
else
{
throw new ArgumentOutOfRangeException($"{nameof(TypeOfClassBase)} must be a subclass of {nameof(ClassBase)}");
}
}
}
}
public class ClassBase
{
}
public class ClassDedrivedA : ClassBase
{
}
public class ClassDedrivedB : ClassBase
{
}
}
您需要在C#中使用typeof
运算符
typeof
运算符返回一个Type
对象,该对象对应于作为参数传递的类型。在处理实例时,您可能不一定知道该类型是什么,因此不能使用typeof
,这就是GetType()
函数存在于对象上的原因
编辑:
我还想检查您是否打算使用IsSubclassOf
,或者您是否确实想使用IsInstanceOfType
/IsAssignableFrom
如果与同一类型进行比较,IsSubclassOf
不会返回true。即
typeof(Type1).IsSubclassOf(typeof(Type1)) //returns false
如果总是将实例与基本类型进行比较,则可以使用IsInstanceOfType
,否则可以使用IsubClassOf
,并附加检查=
。或者,他们的是可从中识别的,但他们可能需要注意这一点。在这种情况下,我总是建议阅读文档-MSDN
编辑2021-03-14:
我知道这是一个老问题,但对于较新版本的C#,可以使用更好的模式匹配语法
// `is` will match for base and derived types
if(value is ClassBase)
_typeOfClassBase = value.GetType();
else
throw new ArgumentOutOfRangeException(...);
您需要在C#中使用typeof
运算符
typeof
运算符返回一个Type
对象,该对象对应于作为参数传递的类型。在处理实例时,您可能不一定知道该类型是什么,因此不能使用typeof
,这就是GetType()
函数存在于对象上的原因
编辑:
我还想检查您是否打算使用IsSubclassOf
,或者您是否确实想使用IsInstanceOfType
/IsAssignableFrom
如果与同一类型进行比较,IsSubclassOf
不会返回true。即
typeof(Type1).IsSubclassOf(typeof(Type1)) //returns false
如果总是将实例与基本类型进行比较,则可以使用IsInstanceOfType
,否则可以使用IsubClassOf
,并附加检查=
。或者,他们的是可从中识别的,但他们可能需要注意这一点。在这种情况下,我总是建议阅读文档-MSDN
编辑2021-03-14:
我知道这是一个老问题,但对于较新版本的C#,可以使用更好的模式匹配语法
// `is` will match for base and derived types
if(value is ClassBase)
_typeOfClassBase = value.GetType();
else
throw new ArgumentOutOfRangeException(...);
似乎是编译时和运行时类型信息的奇怪组合,您试图将其混合在一起。似乎是编译时和运行时类型信息的奇怪组合,您试图将其混合在一起。就我在实际代码中的目的而言,与ClassBase的等价物是抽象的,因此无法实例化,但是,这很好知道。就我在现实生活代码中的目的而言,与ClassBase的等价物是抽象的,因此它不能被实例化,但这很好知道。