C # - метод, который принимает любой тип параметра (повторное использование существующего метода) - PullRequest
1 голос
/ 22 февраля 2012

У меня есть метод serializetoxml, который принимает объект типа obj1 в качестве параметра:

class Program
{
    static void Main(string[] args)
    {
        obj1 myobj = new obj1();
        serializetoxml(myobj);    
    }
}

public class obj1
{
    public string a { get; set; }
    public int b { get; set; }
    public bool c { get; set; }
}

public static void serializetoxml(obj1 myobj)
{
    XmlSerializer myserializer = new XmlSerializer(typeof(obj1));
    TextWriter mywriter = new StreamWriter("C:\\my.xml");
    myserializer.Serialize(mywriter, myobj);
    mywriter.Close();
}

Теперь у меня есть класс obj2, который я хочу передать какего параметр

public class obj2
{
    public int a { get; set; }
    public bool b { get; set; }
    public List<string> c { get; set; }
}

Как повторно использовать метод serializetoxml, чтобы иметь возможность принимать параметры другого типа, чтобы я не стал снова писать тот же метод и изменить тип type на obj2?

obj2 myobj = new obj2();
serializetoxml(myobj);

Ответы [ 6 ]

8 голосов
/ 22 февраля 2012

Добавить параметр типа:

public static void serializetoxml<T>(T myobj)
{
    XmlSerializer myserializer = new XmlSerializer(typeof(T));
    TextWriter mywriter = new StreamWriter("C:\\my.xml");
    myserializer.Serialize(mywriter, myobj);
    mywriter.Close();
}

Затем вы можете использовать его следующим образом:

serializetoxml<obj2>(myobj);

или

serializetoxml<obj1>(myobj);

С помощью магии вывода параметров типаВы можете полностью опустить параметр типа (но это нормально, если вы хотите оставить его там):

serializetoxml(myobj);
7 голосов
/ 22 февраля 2012

Попробуйте следующее

public static void serializetoxml(object myobj) {
    XmlSerializer myserializer = new XmlSerializer(myobj.GetType());
    TextWriter mywriter = new StreamWriter("C:\\my.xml");
    myserializer.Serialize(mywriter, myobj);
    mywriter.Close();
}
1 голос
/ 22 февраля 2012
public static void serializetoxml(object myobj)
{
    XmlSerializer myserializer = new XmlSerializer(obj1.GetType());
    TextWriter mywriter = new StreamWriter("C:\\my.xml");
    myserializer.Serialize(mywriter, myobj);
    mywriter.Close();
}
1 голос
/ 22 февраля 2012

Два варианта:

  • генерики: Serialize<T>(T obj) и typeof(T)
  • объект: Serialize(object obj) и obj.GetType()

Я на самом деле предпочитаю второе для сериализации, основываясь на горьком опыте, но оба действительны.

1 голос
/ 22 февраля 2012

Переместите метод в статический класс и сделайте его методом расширения , например:

internal static class Extensions {
    public static void SerializeToXml<T>(this T myobj)
        {
            XmlSerializer myserializer = new XmlSerializer(typeof(T));
            TextWriter mywriter = new StreamWriter("C:\\my.xml");
            myserializer.Serialize(mywriter, myobj);
            mywriter.Close();
        }
}

Теперь вы можете использовать его, как если бы он был методом экземпляра.Вам нужно поместить свой класс Extensions в то же пространство имен или добавить для него директиву using.

0 голосов
/ 22 февраля 2012

Там действительно нет проблем. Просто заставьте ваш метод сериализации работать с универсальным типом. См. Вопрос переполнения стека Использование обобщений с XmlSerializer .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...