繁体   English   中英

基于泛型接口获取类的对象

[英]get object of class based on generic interface

我有以下实现比较两个对象。

public interface IEqualityDefinition<T>
{
    bool Compare(object source, T target);
}

public class BlockEqualityDefinition : IEqualityDefinition<Block>
{
    public bool Compare(object source, Block target)
    {
        // compare stuff..
        return false;
    }
}

我使用通用接口来指定我想要比较的类。 接下来我有以下方法:

public bool Compare(object source, object target)
{
    // Here i want something else
    IEqualityDefinition definition = new BlockEqualityDefinition();

    return definition.Compare(source, target);
}

在这个方法中,我想基于'target'参数实例化一个类。 例如,当'target'参数包含'Block'对象时,我希望调用正确的EqualityDefinition类来为我做比较。

最好的方法是什么? 我现在无法理解。 谢谢您的帮助!

我头脑中的两个选项:

  • 在存储实现的代码中创建一个映射

     Dictionary<Type, IEqualityDefinition> 

    添加您的实现

     EqualityMap.Add(typeof(Block), new BlockEqualityDefinition) 

    并按您添加的类型进行查询。

     EqualityMap[target.GetType()] 
  • 或者有一个界面,用于扫描所有已加载的程序集以查找所需的类型。 喜欢在如何获取C#中所有已加载类型的列表

    要不总是扫描所有已加载的类型,请将它们缓存在Map中,就像在第一个选项中一样。

你应该看看工厂。 工厂模式可以实现这一点。

(其实不太好) 这里的例子:

class Factory
{
    /// <summary>
    /// Decides which class to instantiate.
    /// </summary>
    public static Position Get(int id)
    {
        switch (id)
        {
        case 0:
            return new Manager();
        case 1:
        case 2:
            return new Clerk();
        case 3:
        default:
            return new Programmer();
        }
    }
}

但在你的情况下(实际上在大多数情况下)我会说你应该使用枚举而不是int - 它更好地重构,理解和阅读:

public enum EqualityDefinitions
{
    Block // or BlockEquality 
    // and more
}

然后你可以像这样使用它:

class EqualityDefinitionFactory
{
    /// <summary>
    /// Decides which class to instantiate.
    /// </summary>
    public static IEqualityDefinition Get(EqualityDefinitions definition)
    {
        switch (definition)
        {
            case EqualityDefinitions.BlockEquality:
                return new BlockEqualityDefinition();
            default:
                throw new NotImplementedException("Unknown type");
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM