Bir tür ve bir arabirim var ve türün arabirimi soyut olarak uyguladığını doğrulamam gerekiyor.Bir .NET türünün belirli .NET arabirimini soyut olarak uygulayıp uygulamadığı nasıl denetlenir?
Yansıma kullanarak kaba kuvvet kodu yazmayı ayarlıyorum ve oldukça çirkin.
Şu an yaptığım kaba kuvvet uygulamasından daha iyi bir yol olup olmadığını merak ediyorum.
Herhangi bir fikrin var mı?
Teşekkürler.
DÜZENLEME
henüz uygulamaya kullanıma değil ama kaba kuvvet taslak kodu şöyle : Kod sahip olduğunu, zaten özelliklere sahip bir sorun görüyor bunu derleme olmadan
public static bool IsAbstractInterfaceImplementation(Type someType, Type someInterface)
{
if (!someInterface.IsAssignableFrom(someType))
{
return false;
}
if (!someType.IsAbstract)
{
return false;
}
var m_interfaceMemberNames = someInterface.GetMembers().Select(m => m.Name).ToList();
// Make sure every interface member implementation is abstract.
foreach (var typeMember in someType.FindMembers(MemberTypes.Event | MemberTypes.Property | MemberTypes.Method, BindingFlags.Public | BindingFlags.Instance, null, null))
{
if (m_interfaceMemberNames.Contains(typeMember.Name))
{
MethodInfo method;
// Make sure the ancestor member is abstract.
switch (typeMember.MemberType)
{
case MemberTypes.Event:
if (!IsAbstractImplementation(((EventInfo)typeMember).GetAddMethod()))
{
return false;
}
method = ((EventInfo)typeMember).GetRemoveMethod();
break;
case MemberTypes.Property:
method = ((PropertyInfo)typeMember).GetGetMethod();
default:
method = (MethodInfo)typeMember;
break;
}
if (!IsAbstractImplementation(method))
{
return false;
}
}
}
return true;
}
public static bool IsAbstractImplementation(MethodInfo methodInfo)
{
const MethodAttributes expectedAttributes =
MethodAttributes.Abstract |
MethodAttributes.Public |
MethodAttributes.NewSlot |
MethodAttributes.Virtual;
return (methodInfo.Attributes & expectedAttributes) == expectedAttributes;
}
arayüzün alıcı ve/veya ayarlayıcıyı tanımlayıp tanımlamadığını ve körü körüne alıcıyı kabul etmek yerine, doğru yöntemi (yöntemleri) doğrulayıp doğrulamadığını kontrol etmek için. Neyse, görebildiğimiz gibi, kod oldukça sıkıcı. daha iyi bir yolu olup olmadığını
DÜZENLEME ... merak ediyorum 2
- Bu sadece bir taslak uygulama olduğunu, stres isteyen, basit durumlar için çalışır ve daha fazlası için bozuldu Karmaşık olanlar, yöntem aşırı yükleri veya yöntem yeniden adlandırmaları gibi (Ben VB bilmiyorum, bu yüzden mümkün olduğunu bile düşünmedim). Ancak, doğru yapmak için çok çalışma gerektirdiğini vurgulamak isterim.
- Neden böyle bir şey isterim? Dinamik olarak edinilmiş bazı meta verilere dayanarak Reflection.Emit'i kullanarak dinamik olarak türler oluşturmamız gerekiyor. Oluşturulan dinamik tip, IDynamicObject gibi belirli arabirimleri uygular ve bazı atalardan türetilebilir. Bu ata tipi statik olarak derlenir. Yakın zamana kadar, atası türünün IDynamicObject arabirimini uygulamalarına izin verilmedi. Dinamik türün bir örneği verildiğinde, yöntemlerine erişim sağlamak için açık bir şekilde IDynamicObject'e dökülmelidir (hatırlayın, oluşturulan dinamik türün arabirimi gerçekleştirdiğinden emin olun). Bu açık kadroları ortadan kaldırmak istiyorum. Bunu yapmanın tek yolu, atalayıcının türünün IDynamicObject arabirimini kullanmasına izin vermektir. Ancak, uygulama, dinamik tip oluşturma koduyla doğrulanan tüm soyut olmalıdır. Voila.
"Yansıma kullanarak kaba kuvvet kodu" - yükleyebilir misiniz? –
Tam olarak ne anlama geliyor "ne tür soyut arabirimi uygular"? – LBushkin
Tamam, çalıştığından emin olmak için birkaç dakika. – mark