gpt4 book ai didi

.net - 如何检查一种 .NET 类型是否抽象地实现了某个 .NET 接口(interface)?

转载 作者:行者123 更新时间:2023-12-04 02:39:25 25 4
gpt4 key购买 nike

我有一个类型和一个接口(interface),我需要验证该类型是否抽象地实现了接口(interface)。

我已经设置使用反射编写一个蛮力代码,它非常难看。

我想知道是否有比我现在正在做的蛮力实现更好的方法。

有任何想法吗?

谢谢。

编辑

尚未检查实现,但蛮力草稿代码如下所示:

  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;
}

如果不编译它,我已经看到属性的问题,代码必须检查接口(interface)是否定义了 getter 和/或 setter 并验证正确的方法,而不是盲目地假设 getter。无论如何,正如人们所看到的,代码相当枯燥。我想知道是否有更好的方法...

编辑 2
  • 我想强调一下,这只是一个草稿实现,它适用于简单的情况,而对于更复杂的情况它会被打破,比如当有方法重载或方法重命名时(我不知道 VB,所以我什至没有想到是可能的)。但它强调了我的观点,即需要做很多工作才能把它做好。
  • 为什么我会想要这样的东西?我们需要基于某些动态获取的元数据使用 Reflection.Emit 动态创建类型。生成的动态类型实现了某些接口(interface),比如 IDynamicObject,并且可能派生自某个祖先类型。该祖先类型是静态编译的。直到最近,还不允许祖先类型实现 IDynamicObject 接口(interface)。给定动态类型的实例,必须将其显式转换为 IDynamicObject 才能访问其方法(请记住,生成的动态类型确实实现了接口(interface))。我想消除这些明确的类型转换。这样做的唯一方法是让祖先类型实现 IDynamicObject 接口(interface)。但是,实现必须全是抽象的,这是由动态类型创建代码验证的。瞧。
  • 最佳答案

    您可以使用 Type.IsAssignableFrom 来确定一个类型是否实现了特定的接口(interface)。 :

    typeof(MyInterface).IsAssignableFrom(abstractType);

    编辑:在将澄清添加到答案中之后-要确定接口(interface)的所有实现是否对于给定类都是抽象的,您可以通过获取 来更容易地做到这一点。界面 map 对于有问题的类型:
    bool IsAbstractOfInterface(Type classType, Type interfaceType)
    {
    var map = classType.GetInterfaceMap(interfaceType);
    foreach (var info in map.TargetMethods)
    {
    if (!info.IsAbstract)
    {
    return false;
    }
    }
    return true;
    }

    或者也许是一个通用的扩展方法......
    public static bool IsAbstractOf<TInterface>(this Type type)
    {
    var map = type.GetInterfaceMap(typeof(TInterface));
    foreach (var info in map.TargetMethods)
    {
    if (!info.IsAbstract)
    {
    return false;
    }
    }
    return true;
    }

    关于.net - 如何检查一种 .NET 类型是否抽象地实现了某个 .NET 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1639680/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com