c#将类参数传递给构造函数

时间:2015-07-21 19:54:42

标签: c# object constructor

以下代码按原样工作,但我想在构造函数中使用对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);
        }
    }
}

6 个答案:

答案 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应该被称为XmlableListMyProperty已经存在,名为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(它已经 引用)。