Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我们如何区分SDK类对象和自定义类对象? 为了给出我的需求的想法,考虑这些类- class A { } class B { String m_sName; public String Name { get { return m_sName; } set { m_sName = value; } } int m_iVal; public int Val { get { return m_iVal; } set { m_iVal = value; } } A m_objA; public A AObject { get { return m_objA; } set { m_objA = value; } } }_C#_Reflection_C# 2.0 - Fatal编程技术网

C# 我们如何区分SDK类对象和自定义类对象? 为了给出我的需求的想法,考虑这些类- class A { } class B { String m_sName; public String Name { get { return m_sName; } set { m_sName = value; } } int m_iVal; public int Val { get { return m_iVal; } set { m_iVal = value; } } A m_objA; public A AObject { get { return m_objA; } set { m_objA = value; } } }

C# 我们如何区分SDK类对象和自定义类对象? 为了给出我的需求的想法,考虑这些类- class A { } class B { String m_sName; public String Name { get { return m_sName; } set { m_sName = value; } } int m_iVal; public int Val { get { return m_iVal; } set { m_iVal = value; } } A m_objA; public A AObject { get { return m_objA; } set { m_objA = value; } } },c#,reflection,c#-2.0,C#,Reflection,C# 2.0,现在,我需要识别传递给函数的对象的类 void MyFunc(object obj) { Type type = obj.GetType(); foreach (PropertyInfo pi in type.GetProperties()) { if (pi.PropertyType.IsClass) { //I need objects only if (!type.IsGenericType && type.Ful

现在,我需要识别传递给函数的对象的类

void MyFunc(object obj) {
    Type type = obj.GetType();

    foreach (PropertyInfo pi in type.GetProperties()) {
        if (pi.PropertyType.IsClass) { //I need objects only

            if (!type.IsGenericType && type.FullName.ToLower() == "system.string") {
                object _obj = pi.GetValue(obj, null);
                //do something
            }
        }
    }
}
我不喜欢这段代码-

    if (!type.IsGenericType && type.FullName.ToLower() == "system.string") {
因为我必须过滤掉类,比如System.Int16、System.Int32、System.Boolean等等


有没有一种优雅的方法可以让我确定对象是否属于我定义的类而不是系统提供的基本类?

没有一种可靠的方法。我想到的一件事是查看定义了给定类型的程序集:
type.assembly
,并将其与已知程序集列表进行比较。

据我所知,无法知道某个类是来自BCL还是用户定义的类,但也许您可以从一些已知的程序集中缓存一些程序集信息框架dll


您可以循环浏览mscorlib.dll中的所有类,并将它们放入一个列表中,然后对照该列表检查类名。

一种可能的方法是使用该属性并过滤掉其中一个程序集中未声明的任何内容。这种方法的缺点是,您需要在执行时了解所有程序集,这在某些(不太常见)场景中可能很困难。

您可以查看类型的
程序集
属性上的
AssemblyQualifiedName
的PublicKeyToken属性。但是,您必须收集框架在不同版本的运行时中使用的不同标记,并与之进行比较。

如果可能的话,最简单的方法是使用可以检查的属性标记您自己的类(而不是检查泛型和类型名)

我有一个便宜快捷的解决方案,可能会奏效:

if( type.IsClass && ! type.IsSealed )

String对象是一个类,但它也是针对继承而密封的。只要代码中不使用密封类,这种方法就有效

我正在创建一个泛型/组件类。所以,我不能真正依赖属性,因为上面函数的行为,如果您意识到的话,就是探索传递给它的对象。最终用户可以编写任何带有或不带属性的类,但他们仍然可以使用MyFunc。很难过滤掉。我想我理解。您要查找的是类型为“bool IsBuiltIn”或类似内容的属性。对吗?如果有这样的财产,是的。恐怕我还没有找到这样的东西。据我所知,没有这样的财产。如果您可以接受一个不太理想的解决方案,那么您可以枚举所有导出的mscorlib类型,并对照列表进行检查;例如,使用typeof(string).GetType().Assembly.GetExportedTypes()。哎呀。刚才看到Jorge在下面提出了相同的解决方案。是的。在创建泛型/组件类时,这会使工作更加困难。最终用户可以编写任何具有或不具有属性的类。很难过滤掉。