关于c#:如何使用字符串中的类名创建Page实现的实例?

How do you make instance of Page implementation with just class name in string?

假设我有一个名为my page的网页,它实现了page,但也实现了我自己的接口my interface。我的目标是在MyInterface中用字符串中的类名称调用一个名为MyFunction的函数。

1
2
3
4
5
6
7
8
9
public interface MyInterfac{
          Myfunction();
    }
public partial class MyPage1: Page, MyInterface{
          Myfunction(){ return"AAA"; }
    }
public partial class MyPage2: Page, MyInterface{
          Myfunction(){ return"BBB"; }
    }

下面是我可以得到的信息:

1
2
    string pageName1 ="MyPage1";
    string pageName2 ="MyPage2";

如何从这里到达沿着以下路线的某个地方:

1
2
   (MyInterface)MyPage1_instance.Myfunction();         //Should return AAA;
   (MyInterface)MyPage2_instance.Myfunction();         //Should return BBB;

编辑:当我尝试创建MyInterface的实例时,它不起作用:

1
2
Type myTypeObj = Type.GetType("MyPage1");
MyInterface MyPage1_instance = (MyInterface) Activator.CreateInstance (myTypeObj);


如果您要查找的信息在类型的一个实例和下一个实例之间没有变化,那么您可能应该使用一个属性。下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[System.ComponentModel.Description("aaa")]
class Page1 { }

[System.ComponentModel.Description("bbb")]
class Page2 { }

[TestClass]
public class Tests
{
    private static string GetDescription(string typeName)
    {
        var type = System.Reflection.Assembly.GetExecutingAssembly()
            .GetTypes().Single(t => t.Name == typeName);

        return type.GetCustomAttributes(false)
            .OfType<System.ComponentModel.DescriptionAttribute>()
            .Single().Description;
    }

    [TestMethod]
    public void MyTestMethod()
    {
        Assert.AreEqual("aaa", GetDescription("Page1"));
        Assert.AreEqual("bbb", GetDescription("Page2"));
    }
}

几张纸条

  • System.ComponentModel中四处看看,看看是否已经有了一个适合您所要做的事情的属性。我在这个例子中使用了Description属性。如果找不到好的属性,请创建自己的自定义属性。
  • 如果您有可用的信息,那么最好使用Type.GetType("Qualified.Name.Of.Page1")