繁体   English   中英

简单类+工厂的通用解决方案

[英]Generic solution to simple classes + factory

我的小脑袋无法为这个问题找到一个优雅的解决方案。 假设我有这样的课程:

    public class Foo<T>
    {
        public RecordType Type { get; set; }
        public T Value { get; set; }
    }

RecordType可能看起来像这样:

 public enum RecordType
    {
        EmptyRecord,
        BooleanRecord,
        IntegerRecord,
        StringRecord,
        ByteRecord
    }

目标是统一处理IEnumerable<Foo<T>>以进行迭代和/或打开RecordType并执行操作,同时尽可能避免装入内在类型。 另外,使用工厂从工厂方法创建这些Foo会很不错。

我在基类或接口中偶然发现了一些常见的快速实现,而我想出的任何东西都没有回答这个看似非常简单的问题。

小编辑:我应该提到我的主要目标是使用.Value而不强制调用者进行强制转换。

您可以引入一个非通用接口IFoo:

public interface IFoo
{
    RecordType Type { get; set; }
}

这是由泛型Foo类实现的:

public class Foo<T> : IFoo
{
    public T Value { get; set; }
}

并创建一个工厂方法,根据RecordType创建一个Foo实例:

public static IFoo CreateFoo(RecordType type)
{
    switch (type)
    {
        case RecordType.Bool: return new Foo<bool>();
        // ...
    }
}

一旦以这种方式创建了Foo实例,就无法访​​问该值,因为您还不知道类型参数。 但是您可以使用Type属性检查类型并执行相应的强制转换:

IFoo foo = CreateFoo(RecordType.Bool);

if (foo.Type == RecordType.Bool)
{
    Foo<bool> boolFoo = (Foo<bool>)foo;
    bool value = boolFoo.Value;
}

如果您有一个适用于Foo对象的方法,例如:

void DoIt<T>(IEnumerable<Foo<T>> foos)
{
    foreach (Foo<T> foo in foos)
    {
        Qux(foo.Value);
    }
}

并且有一个可枚举的IFoo对象,你可以Cast / OfType:

IEnumerable<IFoo> foos = // ...
DoIt<bool>(foos.OfType<Foo<bool>>());

因此,基本上,当您在编译时知道T时使用Foo <T>,而如果您仅在运行时知道T,则使用IFoo。 IFoo需要检查以在运行时将其变为某个T的Foo <T>。

暂无
暂无

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

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