2012-08-14 74 views
16

我有一些問題。我想按名稱創建類的實例。 我發現Activator.CreateInstancehttp://msdn.microsoft.com/en-us/library/d133hta4.aspx它工作正常,我發現這個: Setting a property by reflection with a string value 了。C#創建類的實例和按字符串名稱設置屬性

但如何做到這一點?我的意思是,我知道班級的名字,我知道班上的所有屬性,我有這個字符串。 例如:

string name = "MyClass"; 
string property = "PropertyInMyClass"; 

如何創建實例,並設置一定的參考價值屬性?

+1

你幾乎不能做這樣的事情。對象的創建和設置屬性與Reflection的觀點是完全不同的。此外,你將不得不分別設置每個屬性。當然,你可以創建一個幫助函數,它會把你的字符串拆分,分解,然後創建對象並設置proeprties。我認爲它應該爲你做詭計。 – quetzalcoatl 2012-08-14 18:54:32

回答

44

您可以使用反射:

using System; 
using System.Reflection; 

public class Foo 
{ 
    public string Bar { get; set; } 
} 

public class Program 
{ 
    static void Main() 
    { 
     string name = "Foo"; 
     string property = "Bar"; 
     string value = "Baz"; 

     // Get the type contained in the name string 
     Type type = Type.GetType(name, true); 

     // create an instance of that type 
     object instance = Activator.CreateInstance(type); 

     // Get a property on the type that is stored in the 
     // property string 
     PropertyInfo prop = type.GetProperty(property); 

     // Set the value of the given property on the given instance 
     prop.SetValue(instance, value, null); 

     // at this stage instance.Bar will equal to the value 
     Console.WriteLine(((Foo)instance).Bar); 
    } 
} 
+1

@Darin,我測試了相同的代碼,它返回的錯誤是「無法從程序集'GenerateClassDynamically_ConsoleApp1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'加載類型'Foo'」。 。異常類型是「System.TypeLoad異常」。我不明白它爲什麼出現? – 2014-07-25 09:23:15

+0

@Darin,我測試了相同的代碼,並且它返回的錯誤是「無法從程序集'GenerateClassDynamically_ConsoleApp1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'加載類型'Foo'」。 。異常類型是「System.TypeLoad異常」。我不明白它爲什麼出現?請幫幫我。我有同樣的要求,它獲得一個SAP服務,我需要生成類並向該類動態添加屬性,並將其發送回服務以獲取響應數據。 – 2014-07-25 09:28:35

1

如果你有System.TypeLoad例外,你的類名是錯誤的。

要使用Type.GetType方法,您必須輸入裝配限定名稱。 與該項目名稱例如:GenerateClassDynamically_ConsoleApp1.Foo

如果是在另一個組裝柔逗號後必須輸入組件名稱(在https://stackoverflow.com/a/3512351/1540350詳細信息): Type.GetType(「GenerateClassDynamically_ConsoleApp1.Foo,GenerateClassDynamically_ConsoleApp1 「);

-3
Type tp = Type.GetType(Namespace.class + "," + n.Attributes["ProductName"].Value + ",Version=" + n.Attributes["ProductVersion"].Value + ", Culture=neutral, PublicKeyToken=null"); 
if (tp != null) 
{ 
    object o = Activator.CreateInstance(tp); 
    Control x = (Control)o; 
    panel1.Controls.Add(x); 
} 
相關問題