2016-10-18 3 views
0

Мне просто интересно, в чем разница между использованием функции, которая принимает параметр типа Type (и еще какой-то параметр) и общую функцию, которая просто хочет тип в angle bracket?Разница между общей функцией и функцией с параметром типа

Идея: Я хочу написать функцию, которая сохраняет тип в файловой системе ma в виде XML-файла. Поскольку XmlSerializer должен иметь тип объекта для сериализации, я хочу знать: что лучше?

private bool SerializeIt(object o, Type t, string filePath) 
{ 
    bool result = false; 
    try 
    { 
     if (File.Exists(filePath)) 
      File.Delete(filePath); 

     XmlSerializer serializer = new XmlSerializer(t); 
     using (FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write)) 
     { 
      serializer.Serialize(fs, o); 
     } 
     result = true; 
    } 
    catch (Exception ex) 
    { 
     result = false; 
     Debug.WriteLine(ex); 
    } 

    return result; 
} 

private bool SerializeIt<T>(T o, string filePath) 
{ 
    bool result = false; 
    try 
    { 
     if (File.Exists(filePath)) 
      File.Delete(filePath); 

     XmlSerializer serializer = new XmlSerializer(o.GetType()); 
     using (FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write)) 
     { 
      serializer.Serialize(fs, o); 
     } 
    } 
    catch (Exception ex) 
    { 
     result = false; 
     Debug.WriteLine(ex); 
    } 

    return result; 
} 
+0

Вы должны изменить свой параметр 'o' как' T' вместо 'object', тогда он может начать иметь смысл. –

+0

@MikeEason: done – Radinator

+0

В этом случае генерики ничего не добавляют к самому методу, так как вы не полагаетесь на его тип во время компиляции. Поэтому я не вижу необходимости в генериках или параметре типа, вы можете просто использовать 'o.GetType()' в обоих случаях, если вам не нужно обрабатывать нули. Если nulls - это проблемы, то ваша общая версия имеет ошибку. –

ответ

2

Ваш первый метод будет работать только с типом SomeData1, так что тип вы укажете. Другой метод работает с любым типом, прошедшим через T.

Вышеупомянутый выпуск можно решить с помощью o.GetType() вместо typeof(SomeData1). Тем не менее, второй метод дает вам возможность использовать базовый класс в качестве базы сериализации, который очистит все свойства в классе получения.

+0

Последнее предложение - это то, что я искал. Благодаря! – Radinator

1

Функция private bool SerializeIt(object o, Type t, string filePath) оценивается во время выполнения. Где функция private bool SerializeIt<T>(T o, string filePath оценивается во время компиляции. Это вставляет указанный тип в код IL.

1

Существует много различий. Во-первых, вы можете создать ограничения для общих параметров, например .:

private bool SerializeIt<T>(T o, string filePath) where T: ISomething 

Во-вторых - свободный вывод типа для обобщенных типов.

private bool SerializeIt<T>(T o, string filePath) 

Something something = new Something(); 
o.SerializeIt(something, ""); // dont need to pass type (can infer from first argument). 

В-третьих - вы работаете на бетонную сильного типа, например .:

private bool SerializeIt<T>(T o, string filePath) 

Обычно это делает интерфейс проще и чище. Вам не нужно использовать свободно типизированные объекты.

Смежные вопросы