Based on information in this question, you can accomplish this using the following code:
public static class TypeExtensions
{
private static List<byte[]> tokens = new List<byte[]>()
{
new byte[] {0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89},
new byte[] {0x31, 0xbf, 0x38, 0x56, 0xad, 0x36, 0x4e, 0x35},
new byte[] {0xb0, 0x3f, 0x5f, 0x7f, 0x11, 0xd5, 0x0a, 0x3a}
};
public static bool IsFrameworkType(this Type type)
{
if (type == null) { throw new ArgumentNullException("type"); }
byte[] publicKeyToken = type.Assembly.GetName().GetPublicKeyToken();
return publicKeyToken != null && publicKeyToken.Length == 8
&& tokens.Contains(publicKeyToken, new ByteArrayEqualityComparer());
}
}
The set of public key tokens are valid for .NET 2.0 and higher (including .NET 4.0). The ByteArrayEqualityComparer
class looks like:
public class ByteArrayEqualityComparer : EqualityComparer<byte[]>
{
public override bool Equals(byte[] x, byte[] y)
{
return x != null && y != null
&& x.Length == 8 && y.Length == 8
&& x[0] == y[0]
&& x[1] == y[1]
&& x[2] == y[2]
&& x[3] == y[3]
&& x[4] == y[4]
&& x[5] == y[5]
&& x[6] == y[6]
&& x[7] == y[7];
}
public override int GetHashCode(byte[] obj)
{
return obj.GetHashCode();
}
}
You would then use this method like:
Debug.WriteLine("Is type `string` a .NET Framework type? {0}",
typeof(string).IsFrameworkType());