我有两个班级:
public class HumanProperties { int prop1; int prop2; string name;}
public class Human{int age; HumanProperties properties;}
现在,如果我想创建人类的新实例,我必须Human person = new Human();
但是当我尝试访问类似person.properties.prop1=1;
然后我在属性上有nullRefrence时,因为我也必须创建新属性。
我必须这样做:
Human person = new Human();
person.properties = new HumanProperties();
现在我可以访问此person.properties.prop1=1;
这是一个小例子,但我有从xsd生成的巨大类,我没有太多时间手动生成这个“人”类及其所有子类。 有什么方法可以通过编程方式进行,还是有一些生成器呢?
或者我可以遍历类并为每个属性创建新类typeof属性并将其加入父类吗?
谢谢!
答案 0 :(得分:7)
我不认为有一种传统方式可以满足您的要求,因为类的默认类型是null
。但是,您可以使用反射以递归方式遍历属性,使用无参数构造函数查找公共属性并初始化它们。这样的事情应该有效(未经测试):
void InitProperties(object obj)
{
foreach (var prop in obj.GetType()
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.CanWrite))
{
var type = prop.PropertyType;
var constr = type.GetConstructor(Type.EmptyTypes); //find paramless const
if (type.IsClass && constr != null)
{
var propInst = Activator.CreateInstance(type);
prop.SetValue(obj, propInst, null);
InitProperties(propInst);
}
}
}
然后你可以像这样使用它:
var human = new Human();
InitProperties(human);
答案 1 :(得分:4)
我建议你使用构造函数:
public class Human
{
public Human()
{
Properties = new HumanProperties();
}
public int Age {get; set;}
public HumanProperties Properties {get; set;}
}
答案 2 :(得分:1)
您可以将您的班级声明更改为:
public class Human
{
int age;
HumanProperties properties = new HumanProperties();
}
答案 3 :(得分:0)
.NET使用属性。
您可以使用Visual Studio键盘快捷键:Ctrl + r,Ctrl + e自动生成属性。
试试这个:
public class HumanProperties
{
public int Prop1
{
get { return _prop1; }
set { _prop1 = value; }
}
private int _prop1 = 0;
public int Prop2
{
get { return _prop2; }
set { _prop2 = value; }
}
private int _prop2;
public string Name
{
get { return _name; }
set { _name = value; }
}
private string _name = String.Empty;
}
public class Human
{
public int Age
{
get { return _age; }
set { _age = value; }
}
private int _age = 0;
public HumanProperties Properties
{
get { return _properties; }
set { _properties = value; }
}
private HumanProperties _properties = new HumanProperties();
}