我找到的与这个问题相关的最接近的答案并没有真正帮助解决它,尽管也许我在搜索它时做得很差。
现在,我要解决的是:
我想完全完整地填写和初始化一个对象,我只有Type,而这个对象没有构造函数,直到运行时我才知道它是什么类型。
private readonly Dictionary<string, object> exampleDict = new Dictionary<string, string> { { "String", "\"String\"" }, { "Guid", Guid.NewGuid() }, { "Boolean", False }, { "int", 0 }, { "Decimal", 5.004 }, { "Int32", 0 }, { "Float", 10.01 }, { "Double", 0.101 } };
//Essentially a dictionary of what to init properties to
private object PopulateType(Type propertyType)
{
object o = Activator.CreateInstance(propertyType);
if(exampleDict.hasKey(propertyType.ToString())) //If it is in the dictionary, init it
o = exampleDict[propertyType.Name];
else
foreach(var property in o.getProperties())//Otherwise look at each of its properties and init them to init the object
PopulateType(typeof(property));
}
以上不是我实际拥有的,我怀疑它是否可以开箱即用(实际代码目前有很多我从 SO 答案中尝试过的不同的东西,而且按照我想要的方式重写它更容易)
我还需要担心会有所不同的数组(以及扩展列表和字典),但我主要是想弄清楚问题的主要部分。
提前感谢所有帮助 - 我只是希望这是可能的:)
编辑更多细节:换句话说,说我有以下课程:
public class ClassOne
{
public string BirthCountry {get; set;}
public string BirthCity {get; set;}
}
public class ClassTwo
{
public string FirstName {get; set;}
public string LastName {get; set;}
public ClassOne BirthPlace {get; set;}
}
我想做的是打电话:
object newObject = PopulateType(typeof(ClassOne))
或者
object newObject = PopulateType(typeof(ClassTwo))
我事先不知道我会使用哪一个,也没有构造函数。如果它是一个put into ,我希望能够设置BirthCountry
和BirthCity
“字符串” ,并且我希望能够设置,
但是我希望能够为我碰巧拥有的任何课程做到这一点(这些只是例子)。ClassOne
PopulateType
FirstName="String"
LastName="String"
BirthPlace=new ClassOne { BirthCountry="String", BirthCity="String" }
进一步编辑
我能够从类型中创建基类。但我无法点击属性将它们设置为除 null 之外的任何内容。
编辑 - 在 Fruity Geek(非常感谢朋友)的帮助下,我能够让程序正常工作。
private object PopulateType(Type propertyType)
{
object o = null;
if (exampleDict.ContainsKey(propertyType.Name))
o = exampleDict[propertyType.Name];
else
{
var types = AppDomain.CurrentDomain.GetAssemblies().ToList().SelectMany(s => s.GetTypes()).Where(p => propertyType.IsAssignableFrom(p));
try{o = Activator.CreateInstance(propertyType);}
catch{o = Activator.CreateInstance(types.Last());}
foreach (PropertyInfo prop in o.GetType().GetProperties())
try
{
prop.SetValue(o, PopulateType(prop.PropertyType), null);
}
catch (Exception){}
}
return o;
}
请注意,try/catch 是为了:如果接口未实现,则防止爆炸,并且不尝试实例化 dicts/lists/arrays(那些仍然需要工作)