C# 获取实现接口的类的名称

C# 获取实现接口的类的名称,c#,.net,reflection,system.reflection,C#,.net,Reflection,System.reflection,我有一些实体,它们可能从其他对象继承,也可能不从其他对象继承,但它们将实现一个接口,我们称之为IMyInterface public interface IMyInterface { long MyPropertyName { get; set; } } 对象将始终实现此接口,但它可能已在对象继承自的类上实现。如何获取实现此接口的类的名称 举例说明这些结果 public class MyClass : IMyInterface { } public class MyHighClas

我有一些实体,它们可能从其他对象继承,也可能不从其他对象继承,但它们将实现一个接口,我们称之为IMyInterface

public interface IMyInterface {
    long MyPropertyName { get; set; }
}
对象将始终实现此接口,但它可能已在对象继承自的类上实现。如何获取实现此接口的类的名称

举例说明这些结果

public class MyClass : IMyInterface {

}

public class MyHighClass : MyClass {

}

public class MyPlainClass {

}

public class PlainInheritedClass : MyPlainClass, IMyInterface {

}
如果我传入MyClass,它应该返回MyClass,因为MyClass实现了接口

如果我传入MyHighClass,它应该返回MyClass,因为MyClass是继承的,并且它实现了接口

如果我传入PlainInheritedClass,它应该返回PlainInheriedClass,因为它继承自MyPlainClass,但它没有实现接口,PlainInheritedClass实现了

编辑/解释

我正在使用实体框架6。我创建了一种回收站功能,允许用户删除数据库中的数据,但实际上它只是隐藏了数据。为了使用此功能,实体必须实现一个接口,该接口具有针对它的特定属性

我的大多数实体并不继承任何东西,只是实现接口。但我有两个实体确实继承自另一个对象。有时他们从继承的对象实现接口,有时对象本身实现接口

当我设置值时,我使用实体和实体框架计算出要更新的表。但是当我“取消设置”属性时,我使用的是我自己的SQL语句。为了创建我自己的SQL语句,我需要找出哪个表中有我需要更新的列

我无法使用entity framework仅基于类型加载实体,因为
.Where
不存在于泛型DbSet类中

所以我想创建一个类似于此的SQL语句

UPDATE tableX SET interfaceProperty = NULL WHERE interfaceProperty = X

我只是想得太多了,功能很简单。只要把某人需要的东西包起来就行了siliar,给你,我把它做成了通用的。你可以把它改成一个扩展

代码只是一路交互,一直到基类,然后在返回树的过程中检查每个类

public Type GetImplementingClass(Type type, Type interfaceType)
{
    Type baseType = null;

    // if type has a BaseType, then check base first
    if (type.BaseType != null)
        baseType = GetImplementingClass(type.BaseType, interfaceType);

    // if type
    if (baseType == null)
    {
        if (interfaceType.IsAssignableFrom(type))
            return type;
    }

    return baseType;
}
所以我不得不用我的例子这样称呼它

// result = MyClass
var result = GetClassInterface(typeof(MyClass), typeof(IMyInterface));

// result = MyClass
var result = GetClassInterface(typeof(MyHighClass), typeof(IMyInterface));

// result = PlainInheritedClass 
var result = GetClassInterface(typeof(PlainInheritedClass), typeof(IMyInterface));

你做了什么努力?你想要它做什么?可能是
typeof(MyClass)。Name
?这太基本了,无法询问可能的重复。如果层次结构中的多个类实现了该接口,那么你得到的是最低(最基本)的类。