簡體   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