[英]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>
。 您需要將T
或typeof(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.