首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#反射检查FieldType是某个列表

C#反射检查FieldType是某个列表
EN

Stack Overflow用户
提问于 2017-08-03 14:57:30
回答 1查看 2.2K关注 0票数 0

是否可以指定testList<>而不指定List<int>的条件类型

代码语言:javascript
复制
namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            SuperClass1 class1 = new SuperClass1();
            PrintAllFields(class1);
        }

        public static void PrintAllFields(object obj)
        {
            var SuperClassType = obj.GetType();
            foreach (var item in SuperClassType.GetFields())
            {
                if (item.FieldType == typeof(List<>))
                {
                    Console.WriteLine("it's List");
                }
                else if (item.FieldType == typeof(Int32))
                {
                    Console.WriteLine("it's int32");
                }
                else if (item.FieldType == typeof(Byte))
                {
                    Console.WriteLine("it's byte");
                }
            }
        }
    }

    public class SuperClass1
    {
        public int param1;
        public int param2;
        public int param3;
        public byte param4;
        public List<int> test;
        public SuperClass1()
        {
            test = new List<int>();
        }

    }
}

更新:我使用了相关答案中的函数,现在代码看起来像。而且它不正确。我希望在控制台得到消息Console.WriteLine("it's List");,但似乎我做错了什么。如何解决这个问题?因为我认为这个问题和相关问题是不同的。

代码语言:javascript
复制
namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            SuperClass1 class1 = new SuperClass1();
            PrintAllFields(class1);
        }

        public static void PrintAllFields(object obj)
        {
            var SuperClassType = obj.GetType();
            foreach (var item in SuperClassType.GetFields())
            {
                if (IsInstanceOfGenericType(typeof(List<>), item))
                {
                    Console.WriteLine("it's List");
                }
                else if (item.FieldType == typeof(Int32))
                {
                    Console.WriteLine("it's int32");
                }
                else if (item.FieldType == typeof(Byte))
                {
                    Console.WriteLine("it's byte");
                }
            }
        }

        public static bool IsInstanceOfGenericType(Type genericType, object instance)
        {
            Type type = instance.GetType();
            while (type != null)
            {
                if (type.IsGenericType &&
                    type.GetGenericTypeDefinition() == genericType)
                {
                    return true;
                }
                type = type.BaseType;
            }
            return false;
        }
    }

    public class SuperClass1
    {
        public List<int> test = new List<int>();
        public SuperClass1()
        {
            test = new List<int>();
        }

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-03 15:05:06

我使用这个作为扩展方法。

代码语言:javascript
复制
    public static bool IsList(this Type type)
    {
        return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>);
    }

用法:

代码语言:javascript
复制
    if (item.FieldType.IsList())
    {
        Console.WriteLine("it's List");
    }

若要回答更新的问题,请调用此函数

代码语言:javascript
复制
public static bool IsInstanceOfGenericType(System.Type genericType, object instance)

使用FieldInfo的实例。您在代码中此时没有List<int>的实例。我觉得你最好把密码改成..。

代码语言:javascript
复制
if (IsOfGenericType(typeof(List<>), item.FieldType))
{
... etc
...
public static bool IsOfGenericType(System.Type genericType, System.Type type)
...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45487884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档