2016-09-28 117 views
0

我想爲我的自定義類使用GetType方法。我有類的名稱作爲字符串,我想動態獲取它的類型。對於位於不同目錄中的兩個不同類,我有相同的名稱。如何從字符串c獲得自定義類的類型#

例如:

MyClass.cs在Folder1中:

namespace ConsoleApplication1.Folder1 
{ 
    public class MyClass : IClass 
    { 
     public void PrintMe() 
     { 
      System.Console.WriteLine("I am Folder 1 Class"); 
     } 
    } 
} 

MyClass.cs在FOLDER2:

namespace ConsoleApplication1.Folder2 
{ 
    public class MyClass : IClass 
    { 
     public void PrintMe() 
     { 
      System.Console.WriteLine("I am Folder 2 Class"); 
     } 
    } 
} 

命名空間是ConsoleApplication1

具有相同名稱

不同的類位於Folder1和Folder2中。

我想這是從這樣一個字符串類型:

var runtimeString = "Folder1.MyClass" 

有一個在MSDN命名的GetType(字符串文件名)

提到的方法我怎樣才能得到文件的類型,然後從解決問題在運行時就像型服務定位:

var typeOfMyClass = GetType(runtimeString);  
var instanceOfMyClass = ServiceLocator.Resolve<TypeOfMyClass>(); 
+1

真的很難理解你爲什麼需要這麼做。 – Filburt

+0

示例中兩個「MyClass」類的名稱空間是「ConsoleApplication1.Folder1」和「ConsoleApplication1.Folder2」。您似乎想要基於不包含「ConsoleApplication1」部分的字符串,即「Folder1.MyClass」或「Folder2.MyClass」創建其中一個「MyClass」類的實例。那是對的嗎? –

+0

我有不同的類在不同的位置具有相同的名稱,我想用它們尊重運行時響應。我也想在同一個變量中使用它們。他們也繼承了相同的接口 –

回答

1

你似乎是描述需要一個工廠方法,東西線沿線的:

public class MyClassFactory : IMyClassFactory 
{ 
    private Dictionary<string, Action<IClass>> _factory = 
     new Dictionary<string, Action<IClass>> 
     { 
      ["Folder1.MyClass"] =() => new ConsoleApplication1.Folder1.MyClass(), 
      ["Folder2.MyClass"] =() => new ConsoleApplication1.Folder2.MyClass(), 
      ... 
     }; 

    public IClass GetClassInstance(string myClassName) 
    { 
     if (_factory.Contains(myClassName)) 
     { 
      return _factory[myClassName](); 
     } 
     throw NoSuchClassException(myClassName); 
    } 
} 
0

您可以使用Activator.CreateInstance()方法從其名稱字符串中創建一個類的對象,如下所示。

創建類型對象:

Type type1 = typeof(MyClass); 

Type type1 = Type.GetType("MyClass"); 

創建類型的實例:

Object o = Activator.CreateInstance(type1); 
1

我相信以下是您要完成的任務:

static void Main(string[] args) 
    { 
     var runtimeString = "Folder1.MyClass"; 
     IClass instanceOfMyClass = (IClass)CreateInstance(runtimeString); 
     instanceOfMyClass.PrintMe(); 

     Console.ReadKey(); 
    } 
    private static object CreateInstance(string className) 
    { 
     var type = Assembly.GetExecutingAssembly().GetTypes() 
      .First(t => t.FullName.EndsWith(className)); 

     return Activator.CreateInstance(type); 
    } 
+0

這個解決方案,我一直在尋找,它也很好。但工廠模式會更有用。謝謝。 –