簡體   English   中英

將非泛型類型轉換為通用類型

[英]Casting a non-generic type to a generic one

我有這門課:

class Foo { 
    public string Name { get; set; }
}

而這堂課

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

這就是我想要做的事情:

public Foo<T> GetSome() {
    Foo foo = GetFoo();

    Foo<T> foot = (Foo<T>)foo;
    foot.Data = GetData<T>();
    return foot;
}

將Foo轉換為Foo <T>的最簡單方法是什么? 我無法直接轉換InvalidCastException)並且我不想手動復制每個屬性(在我的實際用例中,有多個屬性),如果我不需要。 是用戶定義的類型轉換方式嗎?

您可以在Foo<T>從Foo創建顯式轉換。

class Program
{
    static void Main()
    {
        Foo foo = new Foo();
        foo.Name = "Blah";
        Foo<int> newfoo = (Foo<int>)foo;
        Console.WriteLine(newfoo.Name);
        Console.Read();
    }
}

class Foo
{
    public string Name { get; set; }
    public object Data { get; set; }
}

class Foo<T>
{
    public string Name { get; set; }
    public T Data { get; set; }
    public static explicit operator Foo<T>(Foo foo)
    {
        Foo<T> newfoo = new Foo<T>();
        newfoo.Name = foo.Name;
        return newfoo;
    }
}

編輯:這只適用於沒有繼承。 您似乎無法執行從基礎到派生類的用戶定義轉換。 請參閱Mads Torgersen的評論http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/14cf27cf-b185-43d6-90db-734d2ca3c8d4/

我們冒昧地在基類和派生類之間預定義轉換(強制轉換),並使語言的語義可預測, 我們不允許你搞亂它

看起來您可能會遇到定義將Foo變為Foo<T> 那,或者放棄繼承。 兩種解決方案都聽起來不太理想

如果您收到InvalidCastException ,則GetFoo()返回的Foo類型不是Foo<T> 您需要將Ttypeof(T)傳遞給該函數,以便它可以返回Foo<T>的實例。

使用復制構造函數。 Foo實現:

class Foo {
     Foo(Foo copy) { ... }
}

而Foo應使用以下內容構建:

class Bar<T> : Foo {
      Bar(Foo copy) : base(copy) { ... }
}

...是。 您需要按成員復制成員,這應該在“復制構造函數”中完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM