获取实现接口

时间:2015-10-02 15:43:18

标签: c# .net reflection system.reflection

我有一些实体,可能会或可能不会从其他对象继承,但它们会实现一个接口,让我们称之为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语句,我需要找出哪个表有我需要更新的列。

我不能仅使用实体框架来加载基于类型的实体,因为.Where在泛型DbSet类上不存在。

所以我想创建一个类似于

的SQL语句
UPDATE tableX SET interfaceProperty = NULL WHERE interfaceProperty = X

1 个答案:

答案 0 :(得分:0)

我只是在考虑整个事情,功能非常简单。只是包住某人需要的东西,在这里,我已经使它成为通用的。你总是可以把它变成一个扩展名。

代码只是向下整合到基类,然后在通过树回来的路上检查每个类。

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