bir Türü Mono.Cecil bir TypeReference gitmek için zaten var mı? açısındanMono.Cecil TipReferans Türü?
18
A
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 birTypeDefition
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
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
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
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
yerine el Assembly.CreateQualifiedName (tr.Module.Assembly.FullName, tr.FullName) kullanabilir, "" ekleyerek. Cecil kullanması nedeniyle – user276648