2016-01-06 48 views
0

我有後者從一個錯誤消息子類的名稱,如下面我如何從一個子類的屬性時,我有類,但子類的字符串名字

string jobDesc = getDtlName(serviceResponse.ErrorMessages[0].Error); 

我的方法有類,並希望訪問子類的屬性,但我怎麼能做到這一點,當我只有子類名字符串。

的Java有其工作原理是這樣

Class myClass = Class.forName(jobDesc); 

我怎樣才能做到在C#相同的方法?

+1

http://stackoverflow.com/questions/1151464/how-to-dynamically-create-generic-c-sharp-object-using-reflection –

回答

0

我設法使用與代碼屬性是一個有效方法如下

PropertyInfo[] properties = typeof(UIStaticFieldErrors).GetProperties(); 
foreach (PropertyInfo property in properties) 
{ 
    if (property.ToString() == "Boolean " + jobDesc) 
    { 
     property.SetValue(errorSF, true); 
    } 
} 

我得到了性能UIStaticFieldErrors的屬性,然後遍歷,直到我得到一個匹配jobDesc,那麼我該字段更新爲true。變量errorSF是UIStaticFieldErrors的一個實例。

0

您可以使用AppDomain.CurrentDomain.GetAssemblies()
然後得到這些組件的所有類型.SelectMany(a => a.GetTypes())
然後用.Single(t => t.Name == jobDesc)給定的名稱來選擇一種類型得到所有加載的程序集

請注意,Single會拋出異常如果不完全匹配1個元素則返回該條件。
如果您有多個類型具有相同名稱(在不同的命名空間中),則應該使用Where來代替。
如果可能有沒有匹配的類,請使用SingleOrDefault,如果沒有匹配元素,則返回null

AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()) 
    .Single(t => t.Name == jobDesc) 

如果所需的班級是在被當前執行大會,您還可以使用

System.Reflection.Assembly.GetExecutingAssembly().GetTypes() 
    .Single(t => t.Name == jobDesc) 
+0

謝謝你的回覆,但我得到一個錯誤'System.Array做不包含SelectMany' – user616076

+0

@ user616076的定義,您必須包含命名空間'System.Linq' – Domysee

+0

謝謝,這是做的伎倆。 – user616076

0

你需要做這樣的事情,

string jobDesc = getDtlName(serviceResponse.ErrorMessages[0].Error); 
SomeClass myClass = new SomeClass(); 
// set some class values, 

var classType = typeof(SomeClass);     
PropertyInfo info = classType.GetProperty(jobDesc); 
var propertyValue = info.GetValue(myClass, null); 

你可能需要做一些小的改動,因爲我沒有測試過這個解決方案,

相關問題