2010-11-15 8 views

cevap

20

"Ne kutusundaki" Yalnızca ModuleDefinition.Import API kullanarak, da başka biçimde olabilir. 'dan bir System.Type ürününe geçmek için, Yansıma ve AssemblyQualifiedName'u kullanarak manuel olarak bakmanız gerekecektir. Cecil'in iç içe geçmiş sınıflardan vb. Kaçmak için IL sözleşmelerini kullandığını unutmayın, bu yüzden bazı manuel düzeltmeleri uygulamanız gerekir. Yalnızca genel olmayan, sigara iç içe türü çözmek istiyorsanız

Gerçi ince olmalıdır. (Bu ne anlama geldiğini ise)

size gereken bir TypeDefition bir TypeReference gitmek için TypeReference.Resolve();


Talep Kod örnek: Yansıma kullanılan konvansiyonlar here açıklanmıştır

TypeReference tr = ... 
Type.GetType(tr.FullName + ", " + tr.Module.Assembly.FullName); 
// will look up in all assemnblies loaded into the current appDomain and fire the AppDomain.Resolve event if no Type could be found 

Cecils sözleşmeleri için Cecil Kaynak Koduna başvurunuz. Jenerik türleri için

+0

için @JohannesRudolph cevabı kontrol edin System.Reflection üzerinden (bağımsız bir kütüphane), bu da onları birbirine dönüştürmenin doğrudan bir yolu olmadığı anlamına gelir. Bunu hala yapabilmelisin, ama hoş görünmeyecek. – ShdNx

+0

Peki, yansıma ile türü nasıl arayabilirim? Ve yansıma iç içe tip ve çekil iç içe tip bir örnek var mı? – Will

+7

yerine el Assembly.CreateQualifiedName (tr.Module.Assembly.FullName, tr.FullName) kullanabilir, "" ekleyerek. Cecil kullanması nedeniyle – user276648

2

böyle bir şey gerekir:

public static Type GetMonoType(this TypeReference type) 
    { 
     return Type.GetType(type.GetReflectionName(), true); 
    } 

    private static string GetReflectionName(this TypeReference type) 
    { 
     if (type.IsGenericInstance) 
     { 
      var genericInstance = (GenericInstanceType)type; 
      return string.Format("{0}.{1}[{2}]", genericInstance.Namespace, type.Name, String.Join(",", genericInstance.GenericArguments.Select(p => p.GetReflectionName()).ToArray())); 
     } 
     return type.FullName; 
    } 

iç içe türü işlemez bu kodu unutmayın, aynı zamanda Mono.Cecil inşa DEĞİLDİR unutmayın bu