![](/img/trans.png)
[英]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.