我想将一个接口列表作为参数传递给方法 然后我想迭代这个列表来调用泛型方法 我怎么能这样做?
//the interfaces
public interface IView{}
public interface IView1 : IView {}
public interface IView2 : IView {}
//the forms
public partial class MyView1 : Form, IView1 {}
public partial class MyView2 : Form, IView2 {}
//this works
var myOpenForm = GetForm<IView1>();
//this doesn't work
var myList = new List<T> { IView1, IView2 }; <-- ERROR: IView1 is a type, which is not valid in the given context
var myOpenForm = GetFirstForm(myList);
//find the first form open of the specified types
public static T GetFirstForm(List<T> viewTypes)
{
foreach (var myType in viewTypes)
{
var form = GetForm<myType>(); <-- ERROR: myType is a variable but is used like a type
if(form != null)
{
return form;
}
}
}
//find form of type T if it is open in the application
public static T GetForm<T>()
{
foreach (var form in Application.OpenForms)
{
if (form is T)
{
return (T)form;
}
}
return default(T);
}
我可以通过在方法签名中将myList
替换为List<T>
来摆脱声明List<Type>
的第一个错误,但后来我不知道我将如何能够用T而不是Type调用内部方法。
答案 0 :(得分:1)
您无法存储类型。您可以存储对象。您可以使用typeof
或GetType()
获取包含类型元数据的对象。此外,类型参数在编译时是固定的,因此您无法在运行时从变量填充它们。
所以不是这个
var myList = new List<T> { IView1, IView2 };
你需要这个
var myList new List<Type> { typeof(IView1), typeof(IView2) };
对于GetFirstForm
来电,您需要更多类似的内容:
public static Form GetFirstForm(List<Type> viewTypes)
{
foreach (var myType in viewTypes)
{
var form = GetForm(myType);
if(form != null)
{
return form;
}
}
}
public static Form GetForm(Type type)
{
foreach (var form in Application.OpenForms)
{
if (type.IsAssignableFrom(form.GetType()))
{
return form;
}
}
return null;
}