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") 。