C#获取访问属性

问题描述 投票:1回答:1

我想用它的名字调用函数属性(也是类型)。

在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));
}
c# python eval getattr
1个回答
3
投票

如果由ITEM_STRING_TO_TYPE,你的意思是Type,那么这里有一些问题:

  • .NET API主要基于.NET; intlong等不是.NET名称 - 它们是C#别名(而.NET目标是多种语言);这意味着你需要在别名和Type之间使用特定于语言的地图(这里的.NET名称分别是System.Int32System.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);
}
© www.soinside.com 2019 - 2024. All rights reserved.