C # Получить свойства доступа - PullRequest
0 голосов
/ 12 февраля 2019

Я бы хотел вызвать атрибут функции (а также тип) по его имени.

В python это выглядит примерно так:

import time

method_to_call = getattr(time, 'clock') #  time.clock()
result = method_to_call()
print(result)

Но как насчет C # и типов?Я хочу использовать sizeof для конвертированных ITEM_STRING_TO_TYPE.Это вообще возможно в C #?

List<string> mainList = new List<string>(new string[]
{
    "bool",
    "byte",
    "char",
    "decimal",
    "double",
    "float",
    "int",
    "long",
    "sbyte",
    "short",
    "uint",
    "ulong",
    "ushort"
});
foreach (string item in mainList)
{
    Console.WriteLine("Size of {0} : {1}", item, sizeof(ITEM_STRING_TO_TYPE));
    // like this
    Console.WriteLine("Size of int: {0}", sizeof(int));
}

1 Ответ

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

если под ITEM_STRING_TO_TYPE вы подразумеваете Type, то здесь есть несколько проблем:

  • .NET API в основном на основе .NET;int, long и т. Д. Не являются именами .NET - они являются псевдонимами C # (и .NET предназначается для нескольких языков);это означает, что вам понадобится языковая карта между псевдонимом и Type (имена .NET здесь System.Int32 и System.Int64 соответственно)
  • sizeof не может бытьиспользуется с Type;есть Unsafe.SizeOf<T>(), но также нельзя использовать напрямую с Type - для этого нужны дженерики, поэтому вам нужно будет отразить с помощью MakeGenericMethod
  • собрать их вместе, иэто действительно не будет стоить - вам лучше просто жестко закодировать значения;или просто используйте массив кортежей:
List<(string name, int size)> mainList = new List<(string,int)>(new []
    {
        ("bool", sizeof(bool)), 
        // ...
        ("ushort", sizeof(ushort)), 
    });

, тогда вы можете использовать:

foreach (var item in mainList)
{
    Console.WriteLine("Size of {0} : {1}", item.name,  item.size);
}

или:

foreach ((var name, var size) in mainList)
{
    Console.WriteLine("Size of {0} : {1}", name, size);
}
...