Snak2013 0 / 0 / 1 Регистрация: 22.08.2013 Сообщений: 70 |
||||
1 |
||||
Как получить тип по его текстовому названию17.11.2014, 10:32. Показов 5198. Ответов 3 Метки нет (Все метки)
Доброго времени суток, Столкнулся со следующей проблемой: Мне необходимо получить список всех полей в классе
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, но лень вспоминать, потому вот тебе велосипед)
Ладно, вот вариант с GetType
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С