Как найти тип по наименованию

Snak2013

0 / 0 / 1

Регистрация: 22.08.2013

Сообщений: 70

1

Как получить тип по его текстовому названию

17.11.2014, 10:32. Показов 5198. Ответов 3

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Доброго времени суток, Столкнулся со следующей проблемой: Мне необходимо получить список всех полей в классе
сделать это было бы не сложно но в метод передается наименование типа в виде строки(string) подскажите как получить тип по его текстовому названию если это возможно, зарание спасибо.

C#
1
2
3
4
5
6
7
public void TestMetod(string type) 
        {
            foreach (PropertyInfo t in typeof(type as Tuple).GetProperties())
            {
            } 
 
        }



0



2148 / 1285 / 516

Регистрация: 04.03.2014

Сообщений: 4,092

17.11.2014, 11:44

2

Лучший ответ Сообщение было отмечено Metall_Version как решение

Решение



0



ITL

283 / 254 / 73

Регистрация: 17.07.2012

Сообщений: 618

17.11.2014, 12:04

3

Есть вариант с GetType, но лень вспоминать, потому вот тебе велосипед)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    class Program
    {
        public class SomeClass
        {
            public int A { get; set; }
            public string B { get; set; }
        }
 
        static void Main(string[] args)
        {
            string className = "SomeClass";
            Assembly asm = typeof (Program).Assembly;
            PropertyInfo[] props = asm.DefinedTypes.First(x => x.Name == className).GetProperties();
            foreach (var prop in props)
            {
                Console.WriteLine(prop.Name);
            }
            Console.ReadLine();
        }
    }

Ладно, вот вариант с GetType

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace ConsoleApplication7
{
    class Program
    {
        public class SomeClass
        {
            public int A { get; set; }
            public string B { get; set; }
        }
 
        static void Main(string[] args)
        {
            string className = "SomeClass";
            PropertyInfo[] props = Type.GetType("ConsoleApplication7.Program+" + className).GetProperties();
            foreach (var prop in props)
            {
                Console.WriteLine(prop.Name);
            }
            Console.ReadLine();
        }
    }
}



0



0 / 0 / 1

Регистрация: 22.08.2013

Сообщений: 70

17.11.2014, 12:34

 [ТС]

4

Спасибо большое за помощь



0



Для получения типа по имени нужно дописывать пространство имен, а лучше использовать полное имя с указанием имени сборки.

Получить тип лучше из сборки. Предварительно её загрузив. Для .Net Core это выглядит так

static Assembly LoadAssembly(string fileName)
    {

        var Dir = AppContext.BaseDirectory;
        string path = Path.Combine(Dir, fileName);
        Assembly assembly = null;
        if (File.Exists(path))
        {
            try
            {
                var asm = System.Runtime.Loader.AssemblyLoadContext.GetAssemblyName(path);
                assembly = Assembly.Load(asm);
            }
            catch (Exception)
            {
                assembly = System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromAssemblyPath(path);
            }
        }
        return assembly;

    }

Ну а из сборки можешь получить и тип используя GetType

Посмотри здесь .Net Core, AppDomain, WCF, RPC маршалинг по Tcp/Ip свой велосипед

Там и поиск типа, методов с параметрами по умолчанию, параметрами массивами, Дженерик методами, методов расширений в том числе Linq, делегатов, объектов поддерживающие IDynamicMetaObjectProvider (DynamicObject,ExpandoObject,JObject).
В том числе поиск дженерик метода с автовыводм типа по параметрам

Например там реализован динамический вызов дженерик метода

// Test Generic Method с параметрами по умолчанию 
    //public string GenericMethodWithDefaulParam<K, V>(Dictionary<K, V> param1, K param2, int param3 = 4, string param4 = "Test")
    var @Int32 = wrap.GetType("System.Int32");
    resGM = TO.GenericMethodWithDefaulParam(dict, 99);
    Console.WriteLine("Вызов дженерик метода с автовыводом  типов " + resGM);

    resGM = TO.GenericMethodWithDefaulParam(pp(@Int32, "System.String"), dict, 99);
    Console.WriteLine("Вызов дженерик метода с аргументами типов " + resGM);



    // Test Generic Method с параметрами массивом
    // public string GenericMethodWithParams<K, V>(Dictionary<K, V> param1, K param2, params string[] args)

    resGM = TO.GenericMethodWithParams(dict, 99, "First", "Second");
    Console.WriteLine("Вызов дженерик метода с автовыводом  типов " + resGM);

Где TO это динамик вызывающий метод по Tcp/IP, но его можно приязать к типу и вызвать методы локально.
Просто для поиска метода из-за перегрузок, дефолтных параметрах, параметрах массивов не всегда простая задача

Для обычного .Net поиск сборки выглядит так.
Сразу прошу прощения за Руслиш.

 private static Type НайтиТип(string type)
        {

            Type result = Type.GetType(type, false);

            if (result != null)
            {

                return result;
            }

            foreach (System.Reflection.Assembly tmpAasembly in
System.AppDomain.CurrentDomain.GetAssemblies())
            {
                result = tmpAasembly.GetType(type);
                if (result != null)
                {
                    return result;
                }
            }

            return null;
        }



    public object ПолучитьТипИзСборки(string type, string путь)
            {
                var result = НайтиТип(type);
                if (result != null)
                    return new AutoWrap(result);

                string ошибка;
                string path;
                System.Reflection.Assembly assembly;
                if (File.Exists(путь))
                    assembly = System.Reflection.Assembly.LoadFrom(путь);
                else
                { 
                    path = Path.Combine(Path.GetDirectoryName(typeof(string).Assembly.Location), путь);
                if (File.Exists(path))
                {

                    var ИмяСборки = AssemblyName.GetAssemblyName(path).FullName;
                    assembly = System.Reflection.Assembly.Load(ИмяСборки);
                }
                else
                {
                    ошибка = " Не найден файл " + путь + " или  " + path;
                    MessageBox.Show(ошибка);
                    throw new COMException(ошибка);

                }
                }

                result = assembly.GetType(type);
                if (result != null)
                {

                    return new AutoWrap(result);
                }

                 ошибка = " неверный тип " + type + " в сборке " + assembly.Location;
                MessageBox.Show(ошибка);
                throw new COMException(ошибка);
                //    return null;
            }

Во-первых, во встроенном языке для работы с одним прикладным объектом реализовано несколько типов.

Например, задачи, которые в 1С:Предприятии 7.7 решал тип Документ решаются теперь несколькими типами. Они разделены по своему назначению.

Тип ДокументСсылка используется для хранения ссылок на объект базы данных в реквизитах других объектов.

Тип ДокументОбъект используется для записи и удаления отдельных документов.

Тип ДокументВыборка используется для перебора документов, хранящихся в базе данных.

Существуют и другие типы данных, предназначенные для работы с документом. При написании модулей используются те типы, которые необходимы для решения конкретных задач.

Во-вторых, 
во встроенном языке нет двух понятий – Тип и Вид. Для каждого объекта конфигурации имеется свой набор типов используемых во встроенном языке для работы с описываемым им прикладным объектом. То есть при использовании конфигурации не будет существовать такого типа как ДокуменСсылка, а будут существовать конкретные типы, например, ДокументСсылка.Счет, ДокументОбъект.Счет, ДокументСсылка.Накладная, и т.д.

Кроме этого, для манипулирования типами используются не их строковые наименования, а специальный тип Тип. Значение типа Тип может быть получено функцией Тип(), получающей в качестве параметра имя типа.

Чтобы проверить тип значения переменной нужно определить ее тип функцией ТипЗнч() и использовать функцию Тип() для получения типа по имени.

Например:

Если ТипЗнч(Основание) = Тип("ДокументСсылка.ПриходнаяНакладная") Тогда 
 ...
КонецЕсли; 

Т.к. в 1С используется не жесткая типизация, и переменные нет необходимости объявлять, может потребоваться узнать текущий тип. Для сравнения необходимо иметь тип, с которым требуется сравнить, для его получения можно использовать функцию Тип.

Подробнее в примере.

Синтаксис

Тип(<Имя>);

Параметры

<Имя> — Имя тип, к примеру Число, Дата, Строка и т.д.

Возвращаемое значение:

тип переменной

Прочее

Доступность (для версии 8.2):
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

Пример

// изначально  строка
ТекДанные = "строка";
// ..... действия с переменной
//стала числом
ТекДанные = 6559450.50;
Результат = ТипЗнч(ТекДанные);
// данное условие ошибочно, т.к. переменная результат содержит тип, а не строку.
Если результат = "Число" Тогда
	сообщить ("Это число"); 
	ТекДанные = ТекДанные - 2;
КонецЕсли;
Если результат = Тип("Число") Тогда
	сообщить ("Это число"); 
	ТекДанные = ТекДанные - 2;
КонецЕсли;

Найти справочник по типу

Я
   DomanM

23.03.15 – 18:58

Есть тип (из описаниетипов.типы()) как найти какой конкретно справочник в виде “Контрагенты” (например) соответствует этому типу?

   Cyberhawk

1 – 23.03.15 – 18:59

СодержитТип()

   DomanM

2 – 23.03.15 – 19:06

(1) это булево же мне перебирать все справочники чтоли и сравнивать?

   Cyberhawk

3 – 23.03.15 – 19:08

“сравнивать” предполагает два источника. Один, как Я понял, это ОписаниеТипов.Типы(). А второй источник – это что?

   DomanM

4 – 23.03.15 – 19:11

(3) не типы. а уже конкретный тип, второй источник типзнач каждого справочника?

   DomanM

5 – 23.03.15 – 19:11

(3) хочется сразу в виде текста этот справочник получить

   Cyberhawk

6 – 23.03.15 – 19:13

Какой “этот”?

   DomanM

7 – 23.03.15 – 19:14

(6) этот, тип которого, в моем ТИПе

   Записьдампа

8 – 23.03.15 – 19:15

Метаданные.НайтиПоТипу(Тип).Имя

   Cyberhawk

9 – 23.03.15 – 19:15

Я так и не понял до конца, но Метаданные.НайтиПоТипу() тебе в помощь

  

DomanM

10 – 23.03.15 – 20:02

(9) спс, то что нужно

TurboConf — расширение возможностей Конфигуратора 1С

Добавить комментарий