Detect if the type of an object is a type defined by .NET Framework

前端 未结 4 1133
我寻月下人不归
我寻月下人不归 2020-12-29 10:38

How can I determine by reflection if the type of an object is defined by a class in my own assembly or by the .NET Framework?

I dont want to supply the name of my ow

4条回答
  •  误落风尘
    2020-12-29 10:57

    Where would third-party types come in? You might want to differentiate between types which claim to be provided by Microsoft and types which don't.

    using System;
    using System.Linq;
    using System.Reflection;
    
    class Test
    {
        static void Main()
        {
            Console.WriteLine(IsMicrosoftType(typeof(string)));
            Console.WriteLine(IsMicrosoftType(typeof(Test)));
        }
    
        static bool IsMicrosoftType(Type type)
        {
            object[] attrs = type.Assembly.GetCustomAttributes
                (typeof(AssemblyCompanyAttribute), false);
    
            return attrs.OfType()
                        .Any(attr => attr.Company == "Microsoft Corporation");
        }
    }
    

    Of course, any type could claim to be a Microsoft one given this scheme, but if you're actually only going to call it on your own types and framework ones, I suspect this should work fine.

    Alternatively, you could use the assembly's public key token. This is likely to be harder to fake. It relies on Microsoft using a common public key for all their assemblies, which they don't (according to Mehrdad's comment below). However, you could easily adapt this solution for a set of accepted "this is from Microsoft" public keys. Perhaps combine the two approaches somehow and report any differences for further inspection...

    static bool IsMicrosoftType(Type type)
    {
        AssemblyName name = type.Assembly.GetName();
        byte[] publicKeyToken = name.GetPublicKeyToken();
    
        return publicKeyToken != null
            && publicKeyToken.Length == 8
            && publicKeyToken[0] == 0xb7
            && publicKeyToken[1] == 0x7a
            && publicKeyToken[2] == 0x5c
            && publicKeyToken[3] == 0x56
            && publicKeyToken[4] == 0x19
            && publicKeyToken[5] == 0x34
            && publicKeyToken[6] == 0xe0
            && publicKeyToken[7] == 0x89;
    }
    

提交回复
热议问题