Kaip nustatyti, ar sąsajos tipas vykdo C # atspindį

Ar C# atspindys atspindi būdą, kaip nustatyti, ar tam tikras System.Type tipas palaiko tam tikrą sąsają?

 public interface IMyInterface {} public class MyType : IMyInterface {} // should yield 'true' typeof(MyType).MODELS_INTERFACE(IMyInterface); 
464
11 февр. Yippie-Ki-Yay nustatė vasario 11 d 2011-02-11 00:49 '11 prie 0:49 2011-02-11 00:49
@ 11 atsakymų

Su savo galva turite keletą galimybių

  1. typeof(IMyInterface).IsAssignableFrom(typeof(MyType))

  2. typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))

Dėl bendros sąsajos tai šiek tiek skiriasi.

 typeof(MyType).GetInterfaces().Any(i => i.IsGenericType  i.GetGenericTypeDefinition() == typeof(IMyInterface<>)) 
781
11 февр. Atsakymą pateikė Jeff 11 vasario mėn. 2011-02-11 00:53 '11 prie 0:53 2011-02-11 00:53

Naudokite Type.IsAssignableFrom :

border=0
 typeof(IMyInterface).IsAssignableFrom(typeof(MyType)); 
50
11 февр. atsakymą pateikė Snea 11 vasario mėn. 2011-02-11 00:52 '11 prie 0:52 2011-02-11 00:52
 typeof(IMyInterface).IsAssignableFrom(someclass.GetType()); 

arba

 typeof(IMyInterface).IsAssignableFrom(typeof(MyType)); 
27
11 февр. atsakymą pateikė ajma 11 vasaris. 2011-02-11 00:53 '11 prie 0:53 2011-02-11 00:53
  public static bool ImplementsInterface( this Type type, Type ifaceType ) { Type[] intf = type.GetInterfaces(); for ( int i = 0; i < intf.Length; i++ ) { if ( intf[ i ] == ifaceType ) { return true; } } return false; } 

Manau, kad tai yra tinkamas leidimas dėl trijų priežasčių:

1) Jis naudoja „GetInterfaces“, o ne „IsAssignableFrom“, tai yra greitesnė, nes „IsAssignableFrom“ po kelių patikrinimų skambina „GetInterfaces“.
2) Ji kartojasi per vietinę masyvą, todėl nebus patikrinimų pasienyje.
3) jis naudoja == operatorių, kuris yra apibrėžtas tipui, todėl jis tikriausiai yra saugesnis nei metodas „Equals“ (kuris galiausiai naudos „Contains call“).

11
11 окт. Atsakymą pateikė Panos Theof Oct 11. 2013-10-11 14:37 '13, 14:37, 2013-10-11 14:37

Aš tiesiog padariau:

 public static bool Implements<I>(this Type source) where I : class { return typeof(I).IsAssignableFrom(source); } 

Norėčiau pasakyti, where I : interface , bet interface nėra galimybė apriboti bendrus parametrus. class yra kuo arčiau.

Naudoti:

 if(MyType.Implements<IInitializable>()) MyCollection.Initialize(); 

Aš ką tik pasakiau „ Implements , nes jis yra intuityvesnis. Aš visada gaunu „ IsAssignableFrom .

6
31 марта '17 в 22:43 2017-03-31 22:43 atsakymas pateikiamas toddmo kovo 31 d. 17 val. 22:43 2017-03-31 22:43

Keisdami Jeffo atsakymą dėl optimalaus veikimo (dėka Pierre Arnaud našumo testo):

 var type = typeof(MyType); var implementsInterface = typeof(IMyInterface).IsAssignableFrom(type)  type.IsClass; 

Jei norite rasti visus tipus, kurie konkrečioje Assembly įdiegia sąsają:

 var implementations = typeof(TypeInTargetAssembly).Assembly.GetTypes() .Where(t => typeof(IMyInterface).IsAssignableFrom(t)  t.IsClass); 
6
07 июля '15 в 22:47 2015-07-07 22:47 atsakymą pateikė Ben Wilde liepos 15 d. 15 val. 10:47 2015-07-07 22:47

Kaip kažkas paminėjo: Benjaminas balandžio 10 d. 13 val. 22:21

Žinoma, buvo lengva ignoruoti ir gauti argumentus „IsAssignableFrom“ priešinga kryptimi. Dabar einu su „GetInterfaces“: p -

Dar vienas būdas yra tiesiog sukurti trumpą pratęsimo metodą, kuris tam tikru mastu atitinka „labiausiai pažįstamą“ mąstymo būdą (ir sutarė, kad tai yra labai mažas asmeninis pasirinkimas, kad jis būtų šiek tiek „natūralus“, remiantis vienu prioritetu). ):

 public static class TypeExtensions { public static bool IsAssignableTo(this Type type, Type assignableType) { return assignableType.IsAssignableFrom(type); } } 

Ir kodėl gi ne šiek tiek labiau apibendrinti (gerai, nežinote, ar tai tikrai įdomu, gerai, manau, tiesiog praleisiu kitą „sintaksinio“ cukraus žiupsnį):

 public static class TypeExtensions { public static bool IsAssignableTo(this Type type, Type assignableType) { return assignableType.IsAssignableFrom(type); } public static bool IsAssignableTo<TAssignable>(this Type type) { return IsAssignableTo(type, typeof(TAssignable)); } } 

Manau, kad tai gali būti daug natūralesnė, bet vėlgi asmeninės nuomonės klausimas:

 var isTrue = michelleType.IsAssignableTo<IMaBelle>(); 
5
05 мая '15 в 2:54 2015-05-05 02:54 Atsakymą pateikė Ehouarn Perret Gegužės 05 '15 , 2:54 2015-05-05 02:54

Teisingas atsakymas

 typeof(MyType).GetInterface(nameof(IMyInterface)) != null; 

Tačiau

 typeof(MyType).IsAssignableFrom(typeof(IMyInterface)); 

gali grąžinti neteisingą rezultatą, nes šis kodas rodo eilutę ir IConvertible:

  static void TestIConvertible() { string test = "test"; Type stringType = typeof(string); // or test.GetType(); bool isConvertibleDirect = test is IConvertible; bool isConvertibleTypeAssignable = stringType.IsAssignableFrom(typeof(IConvertible)); bool isConvertibleHasInterface = stringType.GetInterface(nameof(IConvertible)) != null; Console.WriteLine($"isConvertibleDirect: {isConvertibleDirect}"); Console.WriteLine($"isConvertibleTypeAssignable: {isConvertibleTypeAssignable}"); Console.WriteLine($"isConvertibleHasInterface: {isConvertibleHasInterface}"); } 

Rezultatai:

  isConvertibleDirect: True isConvertibleTypeAssignable: False isConvertibleHasInterface: True 
2
23 нояб. Atsakymą pateikė EricBDev 23 lapkritis. 2017-11-23 20:38 '17 ne 20:38 2017-11-23 20:38

IsAssignableFrom dabar perkeltas į „ TypeInfo :

 typeof(ISMSRequest).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo()); 
2
01 июня '17 в 3:12 2017-06-01 03:12 atsakymas duotas koduotojui nuo birželio 1 d. 17 d. 3:12 2017-06-01 03:12

kaip apie

 if(MyType as IMyInterface != null) 

?

-1
06 дек. atsakymas duotas Pingi 06 d. 2015-12-06 18:47 '15, 18:47 2015-12-06 18:47

Ką apie

 typeof(IWhatever).GetTypeInfo().IsInterface 
-1
08 нояб. Atsakymą pateikė LaWi 08 Nov. 2016-11-08 13:19 '16 at 13:19 2016-11-08 13:19

Kiti klausimai apie žymes arba Užduoti klausimą