[英]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.