Szoftverfejlesztés .NET platformon - Jegyzet 14. fejezet

A VIK Wikiből
A lap korábbi változatát látod, amilyen David14 (vitalap | szerkesztései) 2013. február 5., 23:12-kor történt szerkesztése után volt. (David14 átnevezte a(z) Reflection lapot a következő névre: Szoftverfejlesztés .NET plattformon - Jegyzet 14. fejezet)

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


70-536 .NET Framework 2.0 Application Development Foundation

%TOC{depth="3"}%

Lehetővé teszi típusinformációk lekérdezését futás közben.

Assembly (logikai konténer, de gyakran 1 file-ba is fordítjuk) =

  • assembly metaadatok (név, verzió, erős név, kultúra információ) +
  • típus metaadatok (névtér, osztály név, osztály tagjai, metódusok paraméterei) +
  • kód +
  • erőforrások

Module: típusok gyűjteménye. Egy assembly több modult is tartalmazhat, de mivel nincs rá VS támogatás, szinte mindig csak egy van benne.

Assembly osztály

  • static GetAssembly()
  • static GetCurrentAssembly()
  • static GetEntryAssembly()
  • static GetExecutingAssembly(): referencia a futó assemblyre
  • static Load()
  • static LoadFile()
  • static LoadFrom()
  • static ReflectionOnlyLoad()
  • static ReflectionOnlyLoadFrom()
  • EntryPoint
  • FullName
  • GlobalAssemblyCache
  • Location
  • ReflectionOnly
  • CreateInstance(): példányosít egy osztályt (ha ReflectionOnly módon töltöttük be, Exception)
  • GetCustomAttributes(): visszatér az assembly attribútumok tömbjével,

vagy egy adott típusú attribútummal

  • GetExportedTypes()
  • GetFile()
  • ...
  • GetTypes()
  • IsDefined()

Assembly metaadatok

  • attribútumként, az AssemblyInfo.cs-ben adjuk meg
  • [assembly: AssemblyConfiguration("mód")]: debug vagy release módban forduljon
  • [assembly: AssemblyCompany("cég")]: fejlesztő cég neve
  • [assembly: AssemblyCopyright("copyright infó)]
  • [assembly: AssemblyCulture("de")]: kultúra.

Ha megadjuk, az assembly "satelite assemblyként" fog működni, azaz nem lehet belépési pontja.

  • [assembly: AssemblyDefaultAlias("rövid név")]: alias az assembly hosszú nevére
  • [assembly: AssemblyDescription("leírás")]
  • [assembly: AssemblyFlags(AssemblyNameFlags.EnableJITcompileOptimizer |

AssemblyNameFlags.EnableJITcompileTracking)]: flagek

  • [assembly: AssemblyVersion("1.2.*.*")]: major.minor.build.revision.

A kicsillagozott részekhez a fordító generál egy-egy véletlenszámot.

  • ...

Példa: leírás lekérdezése

Assembly a = Assembly.GetExecutingAssembly();
Type attrType = typeof(AssemblyDescriptionAttribute);
object[] versionAttrs = a.GetCustomAttributes(attrType, false);
if (versionAttrs.Length > 0) {
	 AssemblyDescriptionAttribute desc = (AssemblyDescriptionAttribute)versionAttrs[0];
	 Console.WriteLine("Found Description: {0}", desc.Description);
}

Típusinformációk lekérdezése

  • összes típus a modulban:

Type[] moduleTypes = Assembly.GetExecutingAssembly().GetModules[0].GetTypes();

Type osztály: típusinformációk (objektumoktól GetType() hívással kérhető el, osztályoktól typeof()-fal)

  • Assembly
  • AssemblyQualifiedName
  • Attributes
  • BaseType: közvetlen ős
  • FullName: teljes név, assembly nélkül
  • HasElementType: van-e elemtípusa (pl. tömb)
  • IsAbstract: absztrakt osztály-e
  • IsByRef: referencia szerint típus-e
  • IsClass
  • IsEnum
  • IsGenericType
  • IsInterface
  • IsMarshalByRef
  • IsNotPublic
  • IsPrimitive: beépített (egész vagy lebegőpontos) típus-e
  • IsPublic
  • IsSealed: nem lehet belőle leszármaztatni
  • IsValueType
  • IsVisible: elérhető assembly-n kívülről
  • Module
  • Namespace
  • ConstructorInfo GetConstructor()
  • ConstructorInfo[] GetConstructors()
  • MemberInfo[] GetMembers(BindingFlags flags)
  • ...
  • PropertyInfo[] GetProperties()
  • IsInstanceOfType()
  • IsSubclassOf(): leszármazottja-e egy adott osztálynak (akár többszintű örökléssel)

Bele lehet nézni egy metódus törzsébe is: method.GetMethodBody(). Lekérdezhetők pl. a lokális változók, de a nevük már nem szerepel a metaadatok között.

A member-ök lekérdezésekor a BindingFlags segítségével szűkíthető a találati lista:

  • DeclaredOnly: csak a helyben deklarált tagok
  • FlattenHierarchy: örökölt és helyben deklarált tagok, protected is
  • IgnoreCase
  • Instance: instance tagok is
  • Public: publikus tagok is
  • NonPublic: nempublikus tagok is
  • Static: statikus tagok is

Dinamikus példányosítás

string path = @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll";
Assembly theAssembly = Assembly.LoadFile(path);
Type hashType = theAssembly.GetType("System.Collections.Hashtable");
ConstructorInfo ctor = hashType.GetConstructor(Type.EmptyTypes);  // default ctor
// ConstructorInfo ctor = hashType.GetConstructor(new Type[] { typeof(int) });
Hashtable ht = (Hashtable)ctor.Invoke(new object[] {});

Dinamikus metódushívás

MethodInfo meth = typeof(Hashtable).GetMethod("Add");
meth.Invoke(ht, new object[] { "Hi", "Hello" });  // első argumentum: példány
PropertyInfo prop = typeof(Hashtable).GetProperty("Count");
int count = (int) prop.GetValue(ht, null);
MethodInfo writeLineMethod = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) });
writeLineMethod.Invoke(null, new object[] { count.ToString() });  // statikus metódus hívása

Kódgenerálás

  • AssemblyBuilder
  • ConstructorBuilder
  • EnumBuilder
  • EventBuilder
  • FieldBuilder
  • LocalBuilder
  • MethodBuilder
  • ModuleBuilder
  • ParameterBuilder
  • PropertyBuilder
  • TypeBuilder
  • Assembly létrehozása: AppDomain.DefineDynamicAssembly
  • Modul létrehozása: AssemblyBuilder.DefineDynamicModule
  • Típus létrehozása: ModuleBuilder.DefineType
  • Konstruktor, metódus, stb. létrehozása: TypeBuilder.DefineConstructor, DefineMethod, stb.

-- Peti - 2007.07.03.