如何从类型列表

时间:2018-03-28 02:11:15

标签: c# list generics

我想将一个接口列表作为参数传递给方法 然后我想迭代这个列表来调用泛型方法 我怎么能这样做?

//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调用内部方法。

1 个答案:

答案 0 :(得分:1)

您无法存储类型。您可以存储对象。您可以使用typeofGetType()获取包含类型元数据的对象。此外,类型参数在编译时是固定的,因此您无法在运行时从变量填充它们。

所以不是这个

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;
}