[英]Create a strongly typed c# object from json object with ID as the name
[英]Strongly typed object from string type name (C#)
如果你看看下面的代碼,你(希望)會看到我想要實現的目標。 基本上這段代碼可以:
當然,不是很優雅的偽開關案例,我必須根據我創建的所有不同標准進行更新。
所以,我的問題是,是否有一種“通用”方法來創建一個強類型的實例,使用字符串作為類型的“源”。
我知道我可以使用Reflection來創建一個實例,但這是一個對象類型,所以我無法將它添加到列表中。 哦,只是有了一個想法...使用反射創建對象,將其強制轉換為超類型(SearchCrit),添加到列表中。 真正的類型應該仍然是“正確的子類型”我希望...
將嘗試它,並用結果更新這篇文章。 有更好的想法嗎?
克里斯
private IList<SearchCriteria> _searchCriteriaAll;
public IList<SearchCriteria> SearchCriteriaAll
{
get
{
if (_searchCriteriaAll == null)
{
_searchCriteriaAll = new List<SearchCriteria>();
var tN = typeof (SearchCriteria).ToString();
foreach (var o in DataStorage.LinkedObjects)
{
if (tN.StartsWith(o.TypeName))
{
if (o.TypeName == typeof(StringSearchCriteria).ToString())
_searchCriteriaAll.Add(new StringSearchCriteria(o));
}
}
}
return _searchCriteriaAll;
}
}
編輯:
感謝您的提示,“正確”的方式肯定是工廠模式。 我會調查一下。 現在,我使用這個hack,因為子類太小了,我不想為每一個工廠......(而這個地方目前是唯一一個有這種“花哨”功能的地方)
private IList<SearchCriteria> _searchCriteriaAll;
public IList<SearchCriteria> SearchCriteriaAll
{
get
{
if (_searchCriteriaAll == null)
{
_searchCriteriaAll = new List<SearchCriteria>();
var tN = typeof (SearchCriteria).ToString();
foreach (var o in DataStorage.LinkedObjects)
{
if (tN.StartsWith(o.TypeName))
{
var newO = Activator.CreateInstance(typeof(SearchCriteria).Assembly.FullName, o.TypeName);
var newCrit = newO.Unwrap() as SearchCriteria;
newCrit.DataStorage = o;
_searchCriteriaAll.Add(newCrit);
}
}
}
return _searchCriteriaAll;
}
}
泛型和反思不會成為好朋友。 這里更簡單的方法是使用非通用列表接口:
_searchCriteriaAll = new List<SearchCriteria>();
IList list = (IList) _searchCriteriaAll;
...
Type type = typeof(SearchCriteria).Assembly.GetType(o.TypeName);
list.Add(Activator.CreateInstance(type));
(其中o.TypeName
包含命名空間信息,但不必是程序集限定的)
這仍然是運行時類型安全的(如果它是錯誤的,它將在運行時拋出),並仍然調整相同的列表。
另請注意,我們只通過Assembly.GetType()
直接查看Assembly
內部。
我並不完全清楚你想要實現什么,但你可以從這樣的字符串創建一個Type:
var t = Type.GetType(typeName);
如果要檢查它是否是正確的子類型,可以使用IsAssignableFrom方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.