我有以下代碼,但無法驗證 displayPage 的型別。
使用系統;
public class Page{}
public class ContentPage: Page{}
public class BaseViewModel{}
public class ChildViewModel : BaseViewModel {}
public class Base<T> : ContentPage where T:BaseViewModel{
public void Method(){
Console.WriteLine("in Base=>Method");
}}
public class ChildPage : Base<ChildViewModel> {}
public class Program{
public static void Main(){
Page displayPage = new ChildPage();
Console.WriteLine(displayPage is Base<BaseViewModel>);
if(displayPage is Base<BaseViewModal>) **-> Its returning false** {
(displayPage as Base<BaseViewModel>).Method();
}}}
uj5u.com熱心網友回復:
如果您在通用類中FormBase<T>,那么您只需:
public class FormBase<T> where T: BaseViewModel
{
public void Display(Page displayPage)
{
(displayPage as Base<T>).Method();
}
}
否則,您需要對泛型型別使用協方差。但只有委托和介面才有可能。為此,您需要添加如下介面:
using System;
public class Page { }
public class ContentPage : Page { }
public class BaseViewModel { }
public interface IBase<out T> where T : BaseViewModel
{
void Method();
}
public class Base<T> : ContentPage, IBase<T> where T : BaseViewModel
{
public void Method()
{
Console.WriteLine("in Base=>Method");
}
}
public class Program
{
public static void Main()
{
Page displayPage = new Base<BaseViewModel>();
(displayPage as IBase<BaseViewModel>).Method();
}
}
在宣告 interfaceinterface IBase<out T>中,關鍵字out啟用泛型型別的協變。
檔案中的更多資訊:
泛型中的協變和逆變
uj5u.com熱心網友回復:
您需要將型別與Base類名一起傳遞
(displayPage as Base<BaseViewModel>).Method();
偽代碼
using System;
public class Page
{
}
public class ContentPage: Page
{
}
public class BaseViewModel
{
}
public class Base<T> : ContentPage where T:BaseViewModel
{
public void Method()
{
Console.WriteLine("in Base=>Method");
}
}
public class Program
{
public static void Main()
{
Page displayPage = new Base<BaseViewModel>();
(displayPage as Base<BaseViewModel>).Method();
}
}
這是小提琴:https ://dotnetfiddle.net/hiAPmq
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519892.html
標籤:C#仿制药
