关于c#:获取实现接口的类的名称

Get name of class that implements an interface

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

1
2
3
public interface IMyInterface {
    long MyPropertyName { get; set; }
}

对象将始终实现此接口,但它可能是在对象继承的类上实现的。如何获取实现此接口的类的名称?

示例应给出这些结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyClass : IMyInterface {

}

public class MyHighClass : MyClass {

}

public class MyPlainClass {

}

public class PlainInheritedClass : MyPlainClass, IMyInterface {

}

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

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

如果我传入plainInheritedClass,它应该返回plainInheritedClass,因为它继承自myPlainClass,但它没有实现接口,plainInheritedClass没有

编辑/解释

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

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

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

我不能使用Entity Framework仅基于类型加载实体,因为.Where不存在于通用DBset类上。

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

1
UPDATE tableX SET interfaceProperty = NULL WHERE interfaceProperty = X


我只是想的太多了,功能很简单。只要把某人需要的东西包起来就行了,这是我做的普通的。你可以把它改为扩展名。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
}

所以我不得不这样称呼它,举个例子

1
2
3
4
5
6
7
8
// 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));