Changeset 3638

Show
Ignore:
Timestamp:
12/27/07 18:33:20 (5 years ago)
Author:
PoohKid
Message:

a is ClassA
のType版として考えていた
TypeIs?(t1, t2)
の実装は結局
t2.IsAssignableFrom?(t1)
で済むという結果になりました。

Mayukiさんご指摘ありがとうございます。

Location:
lang/csharp/2.0/Util/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lang/csharp/2.0/Util/trunk/UnitTest/UtilTest.cs

    r3322 r3638  
    6060            br = ta.IsSubclassOf(typeof(Class_A));                                  // 
    6161            br = new List<Type>(ta.GetInterfaces()).Contains(typeof(Class_A));      // 
     62            br = typeof(Class_A).IsAssignableFrom(ta);                              //true 
    6263 
    6364            br = ta.Equals(typeof(Interface_1));                                    // 
    6465            br = ta.IsSubclassOf(typeof(Interface_1));                              // 
    6566            br = new List<Type>(ta.GetInterfaces()).Contains(typeof(Interface_1));  //true 
     67            br = typeof(Interface_1).IsAssignableFrom(ta);                          //true 
    6668 
    67             //Assert.AreEqual(typeof(Class_A).IsInterface, false); 
    68             //Assert.AreEqual(ta.Equals(typeof(Class_A)), true); 
    69             //Assert.AreEqual(ta.IsSubclassOf(typeof(Class_A)), false); 
    70             //Assert.AreEqual(new List<Type>(ta.GetInterfaces()).Contains(typeof(Class_A)), false); 
    71  
    72             //Assert.AreEqual(typeof(Interface_1).IsInterface, true); 
    73             //Assert.AreEqual(ta.Equals(typeof(Interface_1)), false); 
    74             //Assert.AreEqual(ta.IsSubclassOf(typeof(Interface_1)), false); 
    75             //Assert.AreEqual(new List<Type>(ta.GetInterfaces()).Contains(typeof(Interface_1)), true); 
     69            Assert.AreEqual(typeof(Class_A).IsAssignableFrom(ta), Util.TypeIs(ta, typeof(Class_A))); 
     70            Assert.AreEqual(typeof(Interface_1).IsAssignableFrom(ta), Util.TypeIs(ta, typeof(Interface_1))); 
    7671 
    7772            /** 
     
    8277            br = tb.IsSubclassOf(typeof(Class_A));                                  //true 
    8378            br = new List<Type>(tb.GetInterfaces()).Contains(typeof(Class_A));      // 
     79            br = typeof(Class_A).IsAssignableFrom(tb);                              //true 
    8480 
    8581            br = tb.Equals(typeof(Interface_1));                                    // 
    8682            br = tb.IsSubclassOf(typeof(Interface_1));                              // 
    8783            br = new List<Type>(tb.GetInterfaces()).Contains(typeof(Interface_1));  //true 
     84            br = typeof(Interface_1).IsAssignableFrom(tb);                          //true 
    8885 
    8986            br = tb.Equals(typeof(Class_B));                                        //true 
    9087            br = tb.IsSubclassOf(typeof(Class_B));                                  // 
    9188            br = new List<Type>(tb.GetInterfaces()).Contains(typeof(Class_B));      // 
     89            br = typeof(Class_B).IsAssignableFrom(tb);                              //true 
    9290 
    9391            br = tb.Equals(typeof(Interface_2));                                    // 
    9492            br = tb.IsSubclassOf(typeof(Interface_2));                              // 
    9593            br = new List<Type>(tb.GetInterfaces()).Contains(typeof(Interface_2));  //true 
     94            br = typeof(Interface_2).IsAssignableFrom(tb);                          //true 
    9695 
    97             //Assert.AreEqual(typeof(Class_A).IsInterface, false); 
    98             //Assert.AreEqual(tb.IsSubclassOf(typeof(Class_A)), true); 
    99  
    100             //Assert.AreEqual(typeof(Interface_1).IsInterface, true); 
    101             //Assert.AreEqual(tb.IsSubclassOf(typeof(Interface_1)), true); 
    102  
    103             //Assert.AreEqual(typeof(Class_A).IsInterface, false); 
    104             //Assert.AreEqual(tb.IsSubclassOf(typeof(Class_B)), true); 
    105  
    106             //Assert.AreEqual(typeof(Interface_2).IsInterface, true); 
    107             //Assert.AreEqual(tb.IsSubclassOf(typeof(Interface_2)), true); 
     96            Assert.AreEqual(typeof(Class_A).IsAssignableFrom(tb), Util.TypeIs(tb, typeof(Class_A))); 
     97            Assert.AreEqual(typeof(Interface_1).IsAssignableFrom(tb), Util.TypeIs(tb, typeof(Interface_1))); 
     98            Assert.AreEqual(typeof(Class_B).IsAssignableFrom(tb), Util.TypeIs(tb, typeof(Class_B))); 
     99            Assert.AreEqual(typeof(Interface_2).IsAssignableFrom(tb), Util.TypeIs(tb, typeof(Interface_2))); 
    108100 
    109101            /** 
     
    114106            br = tc.IsSubclassOf(typeof(Class_A));                                  // 
    115107            br = new List<Type>(tc.GetInterfaces()).Contains(typeof(Class_A));      // 
     108            br = typeof(Class_A).IsAssignableFrom(tc);                              // 
    116109 
    117110            br = tc.Equals(typeof(Interface_1));                                    // 
    118111            br = tc.IsSubclassOf(typeof(Interface_1));                              // 
    119112            br = new List<Type>(tc.GetInterfaces()).Contains(typeof(Interface_1));  // 
     113            br = typeof(Interface_1).IsAssignableFrom(tc);                          // 
    120114 
    121115            br = tc.Equals(typeof(Class_B));                                        // 
    122116            br = tc.IsSubclassOf(typeof(Class_B));                                  // 
    123117            br = new List<Type>(tc.GetInterfaces()).Contains(typeof(Class_B));      // 
     118            br = typeof(Class_B).IsAssignableFrom(tc);                              // 
    124119 
    125120            br = tc.Equals(typeof(Interface_2));                                    // 
    126121            br = tc.IsSubclassOf(typeof(Interface_2));                              // 
    127122            br = new List<Type>(tc.GetInterfaces()).Contains(typeof(Interface_2));  // 
     123            br = typeof(Interface_2).IsAssignableFrom(tc);                          // 
    128124 
    129125            br = tc.Equals(typeof(Class_C));                                        //true 
    130126            br = tc.IsSubclassOf(typeof(Class_C));                                  // 
    131127            br = new List<Type>(tc.GetInterfaces()).Contains(typeof(Class_C));      // 
     128            br = typeof(Class_C).IsAssignableFrom(tc);                              //true 
    132129 
    133             //Assert.AreEqual(tc.IsSubclassOf(typeof(Class_A)), false); 
    134             //Assert.AreEqual(tc.IsSubclassOf(typeof(Interface_1)), false); 
    135             //Assert.AreEqual(tc.IsSubclassOf(typeof(Class_B)), false); 
    136             //Assert.AreEqual(tc.IsSubclassOf(typeof(Interface_2)), false); 
    137  
    138             //Assert.AreEqual(typeof(Class_C).IsInterface, false); 
    139             //Assert.AreEqual(tc.Equals(typeof(Class_C)), true); 
    140             //Assert.AreEqual(tc.IsSubclassOf(typeof(Class_C)), false); 
     130            Assert.AreEqual(typeof(Class_A).IsAssignableFrom(tc), Util.TypeIs(tc, typeof(Class_A))); 
     131            Assert.AreEqual(typeof(Interface_1).IsAssignableFrom(tc), Util.TypeIs(tc, typeof(Interface_1))); 
     132            Assert.AreEqual(typeof(Class_B).IsAssignableFrom(tc), Util.TypeIs(tc, typeof(Class_B))); 
     133            Assert.AreEqual(typeof(Interface_2).IsAssignableFrom(tc), Util.TypeIs(tc, typeof(Interface_2))); 
     134            Assert.AreEqual(typeof(Class_C).IsAssignableFrom(tc), Util.TypeIs(tc, typeof(Class_C))); 
    141135 
    142136            /** 
     
    146140            br = i1.IsSubclassOf(typeof(Interface_1));                              // 
    147141            br = new List<Type>(i1.GetInterfaces()).Contains(typeof(Interface_1));  // 
     142            br = typeof(Interface_1).IsAssignableFrom(i1);                          //true 
     143 
     144            Assert.AreEqual(typeof(Interface_1).IsAssignableFrom(i1), Util.TypeIs(i1, typeof(Interface_1))); 
    148145 
    149146            /** 
     
    153150            br = i2.IsSubclassOf(typeof(Interface_2));                              // 
    154151            br = new List<Type>(i2.GetInterfaces()).Contains(typeof(Interface_2));  // 
     152            br = typeof(Interface_2).IsAssignableFrom(i2);                          //true 
     153 
     154            Assert.AreEqual(typeof(Interface_1).IsAssignableFrom(i2), Util.TypeIs(i2, typeof(Interface_1))); 
     155            Assert.AreEqual(typeof(Interface_2).IsAssignableFrom(i2), Util.TypeIs(i2, typeof(Interface_2))); 
    155156 
    156157            /** 
     
    160161            br = i3.IsSubclassOf(typeof(Interface_1));                              // 
    161162            br = new List<Type>(i3.GetInterfaces()).Contains(typeof(Interface_1));  //true 
     163            br = typeof(Interface_1).IsAssignableFrom(i3);                          //true 
    162164 
    163165            br = i3.Equals(typeof(Interface_3));                                    //true 
    164166            br = i3.IsSubclassOf(typeof(Interface_3));                              // 
    165167            br = new List<Type>(i3.GetInterfaces()).Contains(typeof(Interface_3));  // 
     168            br = typeof(Interface_3).IsAssignableFrom(i3);                          //true 
    166169 
    167             //Assert.AreEqual(Util.TypeIs(ta, typeof(Class_A)), true); 
    168             //Assert.AreEqual(Util.TypeIs(ta, typeof(Interface_1)), true); 
    169  
    170             //Assert.AreEqual(Util.TypeIs(tb, typeof(Class_A)), true); 
    171             //Assert.AreEqual(Util.TypeIs(tb, typeof(Interface_1)), true); 
    172             //Assert.AreEqual(Util.TypeIs(tb, typeof(Class_B)), true); 
    173             //Assert.AreEqual(Util.TypeIs(tb, typeof(Interface_2)), true); 
    174  
    175             //Assert.AreEqual(Util.TypeIs(tc, typeof(Class_A)), false); 
    176             //Assert.AreEqual(Util.TypeIs(tc, typeof(Interface_1)), false); 
    177             //Assert.AreEqual(Util.TypeIs(tc, typeof(Class_B)), false); 
    178             //Assert.AreEqual(Util.TypeIs(tc, typeof(Interface_2)), false); 
    179             //Assert.AreEqual(Util.TypeIs(tc, typeof(Class_C)), true); 
     170            Assert.AreEqual(typeof(Interface_1).IsAssignableFrom(i3), Util.TypeIs(i3, typeof(Interface_1))); 
     171            Assert.AreEqual(typeof(Interface_3).IsAssignableFrom(i3), Util.TypeIs(i3, typeof(Interface_3))); 
    180172        } 
    181173    } 
  • lang/csharp/2.0/Util/trunk/Util.cs

    r3322 r3638  
    77    public class Util 
    88    { 
     9        public static Boolean TypeIs1(Type t1, Type t2) 
     10        { 
     11            Type wkt = t1; 
     12            while (wkt != null) 
     13            { 
     14                if (wkt.Equals(t2)) 
     15                { 
     16                    return true; 
     17                } 
     18                wkt = wkt.BaseType; 
     19            } 
     20            return false; 
     21        } 
     22        public static Boolean TypeIs2(Type t1, Type t2) 
     23        { 
     24            return t1.Equals(t2) || t1.IsSubclassOf(t2); 
     25        } 
     26        public static Boolean TypeIs3(Type t1, Type t2) 
     27        { 
     28            return t1.Equals(t2) || t1.IsSubclassOf(t2) || new List<Type>(t1.GetInterfaces()).Contains(t2); 
     29        } 
    930        public static Boolean TypeIs(Type t1, Type t2) 
    1031        { 
    11             return false; 
     32            return t2.IsAssignableFrom(t1); 
    1233        } 
    13         //''' <summary> 
    14         //''' �^�̌݊�����F�b�N����        //''' </summary> 
    15         //''' <param name="t1">�^�P</param> 
    16         //''' <param name="t2">�^�Q</param> 
    17         //''' <returns>(t1 Is A t2)�Ȃ�ue</returns> 
    18         //''' <remarks>�C���^�[�t�F�C�X�̎���`�F�b�N�ɂ͖��Ή�</remarks> 
    19         //Private Function TypeIs(ByVal t1 As Type, ByVal t2 As Type) As Boolean 
    20         //    Dim wkT As Type = t1 
    21         //    While wkT IsNot Nothing 
    22         //        If wkT.Equals(t2) Then 
    23         //            Return True 
    24         //        End If 
    25         //        wkT = wkT.BaseType 
    26         //    End While 
    27         //    Return False 
    28         //End Function 
    2934    } 
    3035}