Calendar

<<  décembre 2008  >>
lumamejevesadi
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

View posts in large calendar
Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2008

(février 20, 2008 08:23)

Hello all,

we are quite in a rush at job right now that prevent me from blogging. Anyway, I always keep an eye on things I can learn and tonight while I was browsing in the Lutz Roeder's Reflector, I have seen something very interesting.
A few days ago, with Damien Pinauldt, I was wondering how to to detect if a type implements a given interface or not. Of course if we have an instance, this is very simple but when having only a type, I was not knowing how to do that. Here is what I have found and some recall.

1. Let's create some classes for the demo

class MyIComparable : IComparable
{
   //Implementation omitted
}
 
class MyIComparableT : IComparable<MyIComparableT>
{
   //Implementation omitted
}

1. With an instance

The "is" operator just do perfectly the job, so no problem here

//1. Let's test our type implementing IComparable
MyIComparable t = new MyIComparable();
Console.WriteLine(t is IComparable);                  //True
Console.WriteLine(t is IComparable<MyIComparable>);   //False
 
//2. And now our type implementing IComparable<T>
MyIComparableT t2 = new MyIComparableT();
Console.WriteLine(t2 is IComparable);                 //False
Console.WriteLine(t2 is IComparable<MyIComparableT>); //True

2. With a Type

First "difficulty" : we need to create a "Type" object holding each interface we want to test. Here the typeof operator and the MakeGenericType will help us.

//Let's create Types variable
//MakeGenericType will help us creating the type 
//by defining what the "T" is
Type myIComparable = typeof(MyIComparable);
Type myIComparableT = typeof(MyIComparableT);
Type iComparableT = typeof(IComparable<>)
                    .MakeGenericType(myIComparableT);
Type iComparable = typeof(IComparable);

Now let's compare easily !

//1. Let's test our type implementing IComparable
Console.WriteLine(iComparable.IsAssignableFrom(myIComparable));  //True
Console.WriteLine(iComparableT.IsAssignableFrom(myIComparable)); //False
//2. And now our type implementing IComparable<T>
Console.WriteLine(iComparable.IsAssignableFrom(myIComparableT));  //False
Console.WriteLine(iComparableT.IsAssignableFrom(myIComparableT)); //True

And when I remember I was dealing with the GetInterface or GetInterfaces method. Much simpler like that ! Pretty cool no ?

Billets liés

Ajouter un commentaire


 

  Country flag





Live preview

décembre 2. 2008 15:22

Powered by BlogEngine.NET 1.2.0.0 | Theme by Pierre-Emmanuel Dautreppe