仅当第一个对象实现第二个对象所需的接口时,才在C#中如何在运行时编写两个对象?

巴鲁克

说我有两节课。我想将A类组成B类。

但是,要使其有效,类B必须实现类A所需的一组特定接口。

如何将A类与需要B类实现的接口列表相关联?

我想这样做,以便在运行时某些类型的控制器可以决定是否将一个对象添加到另一个对象。仅当b实现a所需的所有接口时,才将a添加到b。

我希望这是有道理的!谢谢!

哈桑·埃姆拉·桑古(Hasan EmrahSüngü)

就我而言,您或多或少需要以下代码。我在代码中写了很多注释,所以与其尝试详细解释,不如让我讲代码

// I defined a couple of interfaces for test purposes
public interface IA { }
public interface IB : IA { }
public interface IC : IB { }

// ObjectB implements IB thereforce IA as well
public class ObjectB : IB { }


public class ObjectA {

    /// <summary>
    /// Interfaces that Object B must implement
    /// </summary>
    private readonly HashSet<Type> _interfacesObjectBMustImplement = new HashSet<Type>();

    /// <summary>
    /// Adds an interface requirement for object B to implement
    /// </summary>
    /// <param name="requiredInterface">Type of required interface</param>
    public void AddrequiredInterface(Type requiredInterface) {
        var isInterface = requiredInterface.IsInterface;
        if (isInterface == false) {
            throw new Exception($"{requiredInterface.Name} is not an interface");
        }

        var added = _interfacesObjectBMustImplement.Add(requiredInterface);
        if (added == false) {
            throw new Exception($"{requiredInterface.Name} is aready added");
        }
    }

    /// <summary>
    /// Clear the required interface requirements
    /// </summary>
    public void ClearRequiredInterfaces() {
        _interfacesObjectBMustImplement.Clear();
    }

    /// <summary>
    /// Checks whether object A can be composed into <see cref="T" />
    /// </summary>
    /// <typeparam name="T">Type of target object</typeparam>
    /// <param name="targetObjectB">Target object instance</param>
    /// <returns></returns>
    public bool CanBeComsposedInto<T>(T targetObjectB) {
        var allInterfaces = typeof(T).GetInterfaces();
        return _interfacesObjectBMustImplement.IsSubsetOf(allInterfaces);
    }

}


//Creates an object of type ObjectA
var a = new ObjectA(); 

// Add requirement of IA
a.AddrequiredInterface(typeof(IA));

// Add requirement of IB
a.AddrequiredInterface(typeof(IB));

// This is true because a require IA and IB and ObjectB implements both
var canBeAddedInto = a.CanBeComsposedInto(new ObjectB());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过第一个对象在 C++ 中创建第二个对象时,第一个对象去哪里了?

如何加入在第一个进程仍在运行时退出的第二个进程?

两个 JS 对象,从第一个对象中获取它在第二个对象中缺少的值

合并两个对象,但是如果第一个对象已经具有属性,则忽略第二个对象中的属性

C第一个fgets()在第二个运行时被跳过

当第二个中的第一个可观测值需要时,如何在angular2中链接两个可观测的对象

如何从第二个对象更改第一个对象的值?

如果第二个数组的项目包含数组第一个对象的id,则在Angular 8中合并两个对象数组

RxJava:仅当第一个可观察对象抛出错误并从第一个重复时才执行第二个可观察对象

如何获得第一个和第二个对象

如何在 C# 中组合两个项目(从 1ts 项目打开第二个项目和从第二个项目打开第一个项目)

如何在oracle的第二个表中插入第一个表运行时间值?

数组中第一个对象的属性被推送但不是第二个对象

如何运行两个makefile目标,以便第二个使用第一个的变量?

我有两个json文档,我需要使用python比较第一个对象的键是否存在于第二个对象中。他们两个都嵌套

C#合并两个for循环,第二个循环是第一个倒置

Javascript:如果对象具有匹配的键,如何用第二个对象中的值替换第一个对象的值

当第二个参数的生成依赖于第一个参数时,如何编写带有两个参数的测试?

根据对象从第一个参数推断第二个参数

当第二个查询依赖于SQL Server中的第一个查询输出时,如何在存储过程中编写两个查询

如何在每个元素的对象数组中将第二个键值中的第一个键值相乘,然后删除第二个键?

在C ++中,如何仅在第一个“ system()”结束后才执行第二个“ system()”?

Azure WebJobs - 仅在第二个未运行时运行第一个

如何通过在JavaScript中匹配一些值来使用第二个对象更新第一个对象

我想用Angular2中的第一个调用第二个可观察对象

仅当第二个客户端扭曲连接时,第一个才断开连接

当第二个表引用第一个表中的主键时,如何将记录插入到两个表中?

如何在角度6中同步使用第一个正在运行的订阅中的第二个订阅返回值?

如何获得第一个变量的排名是第一个对象中的对象,并且在android中第二个对象中有数组