value.GetType (). IsSubClassOf (ClassBase) выдает мне ошибку «ClassBase - это тип, который недопустим в данном контексте» - PullRequest
0 голосов
/ 05 февраля 2019

Поэтому я пытаюсь проверить, что свойство является производным от базового класса, прежде чем сохранять его в вспомогательном поле.Однако я получаю следующую синтаксическую ошибку 'ClassBase' is a type, which is not valid in the given context для строки value.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
    {

    }
}

1 Ответ

0 голосов
/ 05 февраля 2019

Вам необходимо использовать оператор typeof в C #.

if (value.IsSubclassOf(typeof(ClassBase)))
{
    _typeOfClassBase = value.GetType();
}
else
{
    throw new ArgumentOutOfRangeException($"{nameof(TypeOfClassBase)} must be a subclass of {nameof(ClassBase)}");
}

Оператор typeof возвращает объект Type, который соответствует типу, который был передан в качестве аргумента.Когда вы работаете с экземпляром, вы не обязательно знаете, что это за тип, поэтому typeof нельзя использовать, поэтому функция GetType() существует в классе object.

РЕДАКТИРОВАТЬ: Я также хотел бы проверить, если вы хотите использовать IsSubclassOf или вы действительно хотите использовать IsInstanceOfType / IsAssignableFrom.

IsSubclassOf не возвращает true, если выСравниваешь с однотипными.Т.е.

typeof(Type1).IsSubclassOf(typeof(Type1)) //returns false

Если вы всегда сравниваете экземпляры с базовым типом, тогда вы можете использовать IsInstanceOfType, в противном случае вы можете использовать IsSubclassOf с дополнительной проверкой для ==.В качестве альтернативы их IsAssignableFrom, но они могут быть предостережениями с этим.Я всегда советую читать документацию - в данном случае MSDN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...