2011-04-15 9 views
10

Mono.Cecil'i kullanarak, üzerinde verilen türden derleme türlerini bulmak için kullanıyorum. Normal olarak IsAssignableFrom() yöntemiyle yapılabilir, ancak Cecil'e eşdeğer bir şekilde parmaklayamıyorum. Böyle bir yöntem veya kontrol etmek için başka bir yolu var mı? Teşekkür MikeMono.Cecil type.IsAssignableFrom (türetilmişType) eşdeğeri

+0

Sanırım bu – sehe

cevap

2

ben şöyle dursun, Cecil Mono ile bir şey yapmadım, ama GitHub kaynağı bakarak, ben muhtemelen tip bir TypeDefinition ile bir şeyler yapabileceğini tahmin ediyorum:

public bool HasInterface(TypeDefinition type, string interfaceFullName) 
{ 
    return (type.Interfaces.Any(i => i.FullName.Equals(interfaceFullName)) 
      || type.NestedTypes.Any(t => HasInterface(t, interfaceFullName))); 
} 
+0

+1 için bir 'Rock' görüyorum. Cecil'i kullanarak bir proje yaptığımda, bu tür bir işleve sarılmış bir şey için bir özellik isteği eklemeyi düşündüm, ama hiçbir zaman bu konuya hiç girmedim :) Ayrıca, nedenini ve neden olduğunu da unutmam gerekiyor ama null yapmak zorunda kalabilirsiniz Bunları saymadan önce bu özelliklerin bir kısmını kontrol eder ... –

1

Tür AType türetilmiş türlerini bulmak için bir yöntem, derleme içinde tanımlı olan tüm türleri sıralamak ve onların BaseType özelliğini AType türüyle karşılaştırmaktır. Bu yöntem, seçilmiş bir türden türetilmiş türleri göstermek için ILSpy'de kullanılır. Uygulama, FindDerivedTypes yöntemindedir (DerivedTypesTreeNode.cs). Dolaylı olarak türetilen türleri bulmak için, AType ulaşılana kadar BaseType özelliği (Resolve() kullanarak) veya BaseType null değerine eşit olmalıdır.

0

ApiChange aracı Mono Cecil'i kullanır. Bu sizin tipi komuta

ApiChange.exe -whousestype "CommandBase" ApiChange.Api.dll -in ApiChange.Api.dll -excel

ile türünden dahil türetilmesi kullanılan tüm oluşumları bulabilirsiniz

Bir Excel çıktısını, türünüzün tüm kullanıcılarının dosya ve satır numarası ile alırsınız. Bu

ApiChange.Api.dll internal class ApiChange.Api.Scripting.CorFlagsCommand   Inherits from internal class ApiChange.Api.Scripting.CommandBase C:\Source\ApiChangeTooling\ApiChange.Api\src\Scripting\Commands\CorFlagsCommand.cs 
ApiChange.Api.dll internal class ApiChange.Api.Scripting.WhoImplementsInterfaceCommand   Inherits from internal class ApiChange.Api.Scripting.CommandBase C:\Source\ApiChangeTooling\ApiChange.Api\src\Scripting\Commands\WhoImplementsInterfaceCommand.cs  
ApiChange.Api.dll internal class ApiChange.Api.Scripting.DiffAssembliesCommand   Inherits from internal class ApiChange.Api.Scripting.CommandBase C:\Source\ApiChangeTooling\ApiChange.Api\src\Scripting\Commands\DiffAssembliesCommand.cs  

gibi Cecil kullanarak gerçek kod WhoUsesType.cs

Yours, Alois Kraus

4

Kalıtım kontrolleri bulunur ve "atama uyumluluk" çekleri aslında farklı şeylerdir olduğunu görünüyor. Miras veya "atama uyumluluğu" nı kontrol etmek ister misiniz?

Atama uyumluluğu, imzalı/imzasız dönüşümleri, enum baz tipi dönüşümleri, charshort dönüşümler, jenerik varyans dönüşümleri, arayüzler gelen object dönüşümler, dizilerden IList ve IList<T> ve onların baz arayüzleri de dahil olmak üzere bir çok şey içerir dizi kovaryansı, kısıtlamalara yönelik genel parametre ve bir sürü başka şey.

Yapabileceğiniz en iyi şey tam listesi için ECMA spec int atama uyumluluk ve "doğrulama tipi uyumluluk" kurallarını arama etmektir.

Ben tam "atama uyumluluk kontrolleri" bazı alt kümesini isteyeceksiniz belirli ihtiyaçlarınız için tahmin ediyorum.

Maalesef Cecil sizin için bu uygulayacak herhangi yöntemi yok, ancak bu kendini uygulamasının ülke için yeterli bilgi sağlamaz.

Böyle bir şeyi cecil kullanarak uygularken dikkatli olmanız gerekir. Özellikle, TypeReference sınıfı, bazı durumlarda (çözümlenmemiş tip referans için TypeDefinition'ı bulmak için) aramanız gereken bir "Resolve" yöntemine sahiptir, ancak diğer durumlarda arayacağınız anlamına gelir; ağaç yazın.Ayrıca, genel girişleri karşılaştırmak için "yapısal tip eşitliği" ile uğraşmanız gerekecek ve tip hiyerarşileri yürürken genel parametre ikamesini ele almak zorunda kalacaksınız.

+0

+1. Bazı kod örneklerini görmek güzel olurdu. Tabii ki, detaylı gereklilikler olmadan, belirli bir yaklaşımı tavsiye etmek zordur (cevabınız açıkladığından). –

+0

Bunu yapan bir kod var ... ama seninle paylaşamam ... (en azından şimdi değil). Bunu aktarmak istediğim ana noktalar: 1) Atama uyumluluğu mirastan daha fazlasını kapsar, 2) Miras kontrolleri sizin düşündüğünüzden daha fazla şeyi kontrol etmeyi gerektirir, 3) Göz önünde bulundurmanız gereken her şey ECMA spesifikasyonunda listelenmiştir, 4) Orada Dikkatli olmanız gereken cecil API'sinde bazı tuzaklar var. Yine de sana kod veremem. –

+0

Endişeye gerek yok. Yansımalar/düşük seviye tipi manipülasyon zordur ve ortak davalara yardım etmek, bu cevabın amaçları için iyi olabilir (aynı zamanda Cecil'in kendisi için). Bu cevap hala nasıl yararlıdır :) –