我有後者從一個錯誤消息子類的名稱,如下面我如何從一個子類的屬性時,我有類,但子類的字符串名字
string jobDesc = getDtlName(serviceResponse.ErrorMessages[0].Error);
我的方法有類,並希望訪問子類的屬性,但我怎麼能做到這一點,當我只有子類名字符串。
的Java有其工作原理是這樣
Class myClass = Class.forName(jobDesc);
我怎樣才能做到在C#相同的方法?
我有後者從一個錯誤消息子類的名稱,如下面我如何從一個子類的屬性時,我有類,但子類的字符串名字
string jobDesc = getDtlName(serviceResponse.ErrorMessages[0].Error);
我的方法有類,並希望訪問子類的屬性,但我怎麼能做到這一點,當我只有子類名字符串。
的Java有其工作原理是這樣
Class myClass = Class.forName(jobDesc);
我怎樣才能做到在C#相同的方法?
我設法使用與代碼屬性是一個有效方法如下
PropertyInfo[] properties = typeof(UIStaticFieldErrors).GetProperties();
foreach (PropertyInfo property in properties)
{
if (property.ToString() == "Boolean " + jobDesc)
{
property.SetValue(errorSF, true);
}
}
我得到了性能UIStaticFieldErrors的屬性,然後遍歷,直到我得到一個匹配jobDesc,那麼我該字段更新爲true。變量errorSF是UIStaticFieldErrors的一個實例。
您可以使用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)
謝謝你的回覆,但我得到一個錯誤'System.Array做不包含SelectMany' – user616076
@ user616076的定義,您必須包含命名空間'System.Linq' – Domysee
謝謝,這是做的伎倆。 – user616076
你需要做這樣的事情,
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);
你可能需要做一些小的改動,因爲我沒有測試過這個解決方案,
http://stackoverflow.com/questions/1151464/how-to-dynamically-create-generic-c-sharp-object-using-reflection –