The_Unknown_Member Ответов: 3

[C#] почему мне нужно использовать type. gettype (), когда я создаю новый экземпляр type ?


Почему мне нужно использовать тип.GetType () когда я создаю новый экземпляр типа ? Вместо этого:
Type T = Type.GetType("CSharp_Practicing.Customer");

Почему я не могу просто сделать это ?
Type T = Customer;


Что я уже пробовал:

Задавая вопрос здесь в CodeProject.com

Ralf Meier

Вы не можете использовать это назначение, потому что клиент - это ваш класс (объект), а не тип вашего класса.
Если вы хотите получить тип, вы должны попросить его-вот в чем разница ...

BillWoodruff

Прямое использование ' GetType() и 'typeof () обычно происходит при работе с универсальными классами и методами. См. мой ответ здесь для примеров.

3 Ответов

Рейтинг:
24

OriginalGriff

Потому что Customer не является производным от Type-и вы не можете создать новый экземпляр класса, просто используя имя класса.
Вы можете сделать это:

Type T = typeof(Customer);
И это будет делать то же самое, что и использование GetType.
GetType обычно используется для получения типа, основанного на строковом имени во время выполнения, а не фиксированного типа во время компиляции.


Рейтинг:
2

BillWoodruff

Если у вас есть пример класса, вы можете вызвать экземпляр .GetType () на нем. Если у вас просто есть ссылка к допустимому типу идентификатор ..- это имя ... вы можете вызвать ' typeof(name).

using System;

namespace Whatever
{
    public class TypeFun1
    {
        private string Name;

        public TypeFun1(string name)
        {
            Name = name;
        }
    }

    public class TypeFun2
    {
        private string Name;

        public TypeFun2(string name)
        {
            Name = name;
        }
    }

    public static class FunFactory<T>
    {
        public static T MakeNewT()
        {
            switch (typeof(T).Name)
            {
                case "TypeFun1":
                    return (T) Activator.CreateInstance(typeof(T), "me one");
                case "TypeFun2":
                    return (T) Activator.CreateInstance(typeof(T), "me two");
                default:
                    return default(T);
            }
        }
    }
}
Тест:
public void testClassCreationMethods()
{
    var tclass1 = new TypeFun1("me one");

    var tclass2 = new TypeFun2("me two");

    var tfromfactory1 = FunFactory<TypeFun1>.MakeNewT();

    var tfromfactory2 = FunFactory<TypeFun2>.MakeNewT();

    bool isTypeFun1 = tclass1.GetType() == typeof(TypeFun1); // true

    bool isSameTypes = tfromfactory1.GetType() == typeof(TypeFun1); // true

    bool sametypr = tclass1.GetType() == tfromfactory1.GetType(); // true
}


Рейтинг:
1

CPallini

Потому что они разные звери. Согласно к документации[^]:

Цитата:
Тип-это корень системы.Функциональность отражения и является основным способом доступа к метаданным. Используйте элементы типа для получения информации о объявлении типа, о членах типа (таких как конструкторы, методы, поля, свойства и события класса), а также о модуле и сборке, в которой развернут класс.


пока Customer это просто объявление типа.