Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# value.GetType().IsSubClassOf(ClassBase)给我一个错误';ClassBase';是一种类型,在给定上下文中无效;_C#_Reflection - Fatal编程技术网

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的等价物是抽象的,因此它不能被实例化,但这很好知道。