如何加载从表单和接口扩展的类?

时间:2018-03-15 18:51:14

标签: c# interface casting extend

我有几个基于Form和我的自定义界面扩展的表单类。

Interface InterfaceForms{
      void InterfaceFunc1();
}



public partial class child1 : Form, InterfaceForms
    {
      public child1(){}
      public InterfaceFunc1(){}
    }

public partial class child2 : Form, InterfaceForms
    {
      public child2(){}
      public InterfaceFunc1(){}
    }

我将所有表单类对象添加到列表中,如下所示:

 List<Form> lsf = new List<Form>();

然后我尝试加载我的表单类,如下所示:

 var fr = from Form item in lsf
                         where item.Name == "child1"
                         select item;
Form frm = (Form)fr;

现在,我的问题是我无法访问InterfaceFunc1()。

你介意我告诉我如何实现这个目标吗?请注意,每次frm类型可能不同(child1,child2&amp; etc),但所有这些都是从Form和InterfaceForm扩展的。

1 个答案:

答案 0 :(得分:2)

您需要将其转换为InterfaceForms

var fr = from Form item in lsf
                         where item.Name == "child1"
                         select item;
Form frm = (Form)fr;
var iFaceFrm = frm as InterfaceForms;

if (iFaceFrm != null)
{
    //use the iFaceFrm or frm here
}

修改

您的LINQ语句的问题是声明类型,推断LINQ语句的类型,因此您不要将它放在select中:

var fr = from item in lsf
         where item.Name == "child1"
         select item;

或者,如果你想在程序上这样做:

var fr = lsf.Where(f => f.Name == "child1").FirstOrDefault();