以下代码按原样工作,但我想在构造函数中使用对MyProperty类的引用 而不是内联代码中的强类型引用。
我如何做到这一点,我希望将参考文献传递给MyProperty,但我尝试的所有内容都失败了
我希望PropertyClass能够处理任何MyProperty类,即PropertyClass中没有对MyProperty的引用
如果我错过了显而易见的事情,仍然学习如此抱歉!
非常感谢您的帮助
萨拉
PropertyClass pc = new PropertyClass(!here!); // Would like to pass MyProperty class here
pc.Settings.Add(new MyProperty("Fred", "Monday"));
pc.SaveXml("MyTest.xml");
public class MyProperty
{
[XmlAttribute]
public string MyPropName { get; set; }
[XmlElement]
public string MyPropData { get; set; }
// default constructor needs to be parameterless for serialisation.
public MyProperty()
{
}
public MyProperty(string Name, string Data)
{
MyPropName = Name;
MyPropData = Data;
}
}
public class PropertyClass
{
public List<MyProperty> Settings { get; set; }
public PropertyClass() // How to pass the required class here ?
{ // public PropertyClass( ref MyProperty myprop)
Settings = new List<MyProperty>();
}
public void SaveXml(string fileName)
{
using (FileStream stream = new FileStream(fileName, FileMode.Create))
{
XmlSerializer XML = new XmlSerializer(typeof(List<MyProperty>), new XmlRootAttribute("Settings"));
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty);
XML.Serialize(stream, Settings, namespaces);
}
}
}
答案 0 :(得分:2)
我会将PropertyClass
的定义更改为
public class PropertyClass<T>
{
public List<T> Settings { get; set; }
public PropertyClass()
{
Settings = new List<T>();
}
public void SaveXml(string fileName)
{
using (FileStream stream = new FileStream(fileName, FileMode.Create))
{
XmlSerializer XML = new XmlSerializer(typeof(List<T>), new XmlRootAttribute("Settings"));
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty);
XML.Serialize(stream, Settings, namespaces);
}
}
}
type parameter T
指定List<T>
中项目的类型,以便您可以按如下方式实例化PropertyClass
var pc = new PropertyClass<MyProperty>();
或者当您厌倦了MyProperty
时,您可以将其更改为new PropertyClass<foo>()
而无需在其他地方更改。
我喜欢泛型的另一个不错的功能是你可以在你声明它的行中对type参数设置约束:
public class PropertyClass<T> where T : MyClass, IMyInterface, new()
这意味着T
必须从MyClass
派生,它必须实现IMyInterface
并且必须具有无参数构造函数。 (显然你不需要添加所有这些约束,但在某些情况下它们都有用)。
我想多吵一下,但我相信你可以玩它并找到一些用途。
答案 1 :(得分:1)
我认为你需要一个通用类。
public class PropertyClass<T>
{
public List<T> Settings { get; set; }
public PropertyClass()
{
Settings = new List<T>();
}
...
}
PropertyClass<MyProperty> pc = new PropertyClass<MyProperty>();
我必须补充一点,你的命名很不清楚。 PropertyClass
应该被称为XmlableList
。 MyProperty
已经存在,名为NameValuePair<string,string>
答案 2 :(得分:1)
可能你在寻找泛型:
public class PropertyClass<TMyProperty>
{
public List<TMyProperty> Settings { get; set; }
public PropertyClass()
{
Settings = new List<TMyProperty>();
}
..
}
答案 3 :(得分:1)
处理你的命名,PropertyClass实际上是一个属性集合并不是很明显;也许MyPropertyCollection会更好?
您正在寻找的是构造函数重载。基本上你再次指定构造函数,但这次使用参数:
public MyPropertyCollection()
{
Settings = new List<MyProperty>();
}
public MyPropertyCollection(IEnumerable<MyProperty> collection)
{
Settings = new List<MyProperty>(collection);
}
或者允许var col = new MyPropertyCollection(new MyProperty(), new MyProperty(), new MyProperty())
你可以这样做:
public MyPropertyCollection(params MyProperty[] collection)
{
Settings = new List<MyProperty>(collection);
}
虽然你应该小心,但感觉不对,如果你以后想要引入额外的参数,那么它可能会结束。
此外,由于您基本上包装了一个列表,您还可以考虑将System.Collection.ObjectModel.Collection<T>
类作为基础:
// The Collection<MyProperty> base class is responsible for maintaining the list
public class MyPropertyCollection : Collection<MyProperty>
{
public MyPropertyCollection()
{
// Default base() constructor is called automatically
}
public MyPropertyCollection(IList<MyProperty> properties)
: base(properties)
{
// Overloaded constructor calls base constructor with collection of properties
}
public void SaveXml(string fileName)
{
using (var stream = new FileStream(fileName, FileMode.Create))
{
// Serializer should now target this very class
var xml = new XmlSerializer(typeof (this), new XmlRootAttribute("Settings"));
var namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty);
xml.Serialize(stream, this, namespaces);
}
}
}
答案 4 :(得分:0)
这就是你如何调用构造函数
PropertyClass pc = new PropertyClass(new MyProperty("Fred", "Monday"));
这是构造函数
Public MyProperty MyProperty { get; set; }
public PropertyClass(MyProperty _myProperty)
{
MyProperty = _myProperty
}
答案 5 :(得分:0)
您需要添加一个以MyProperty
为参数的构造函数:
public PropertyClass(MyProperty myprop)
{
Settings = new List<MyProperty> {myprop};
}
请注意,MyProperty
是一种引用类型,因此此处不需要ref
(它已经 引用)。