Передача пространства имен в функцию - PullRequest
3 голосов
/ 10 марта 2011

У меня есть функция, которая берет текстовый документ и сохраняет его в формате HTML.Я хотел бы использовать ту же функцию для работы с любым типом документа.Я попытался использовать дженерики (я предполагаю, что разные doc API одинаковы), но это не помогло по причине, указанной Джоном СкитомЕсть ли другой способ?

using Word = Microsoft.Office.Interop.Word;
using Excel = Microsoft.Office.Interop.Excel;

//Works ok
private void convertDocToHtm( string filename )
{
... snip

     var app = new Word.Application();
     var doc = new Word.Document();
     doc = app.Documents.Open(ref fileName, ref missing, ref trueValue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

... snip    
}

//fails dismally (to compile) because 'T' is a 'type parameter', which is not valid in the given context - i.e Word is a namespace not a class
private void convertDocToHtm2<T>( string filename )
{
... snip

     var app = new T.Application();
     var doc = new T.Document();
     doc = app.Documents.Open(ref fileName, ref missing, ref trueValue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

... snip
}

//calling examples
convertDocToHtm( filename );
convertDocToHtm2<Word>( filename );
convertDocToHtm2<Excel>( filename );

Ответы [ 4 ]

5 голосов
/ 10 марта 2011

Нет, это невозможно.Параметры типа предназначены для типов , а не пространств имен .

В частности, компилятор не смог проверить, существует ли такой тип - вы можете вызвать ConvertDocToHtm2<System> дляпример.

С помощью динамического набора текста в C # 4 вы могли бы сделать что-то такое:

private void ConvertDocToHtm2<TApplication>(string filename)
    where TApplication : new()
{
     dynamic app = new TApplication();
     dynamic doc = app.Documents.Open(filename, html: trueValue);
     // Other stuff here
}

Тогда:

ConvertDocToHtm2<Word.Application>(filename);

(I 'Кстати, вы уже догадались по названию параметра для trueValue - вы бы хотели это проверить.)

1 голос
/ 10 марта 2011

Если вы не хотите использовать динамические типы и если вы используете только несколько методов в каждом пространстве имен, и если эти методы имеют одинаковую сигнатуру, вы можете создать свой ConvertDocToHtml2 для приема делегатов. Затем передайте методы в Word / Excel в качестве этих делегатов.

1 голос
/ 10 марта 2011

Это невозможно, потому что универсальные шаблоны в C # являются функцией времени компиляции, а тип должен быть известен во время компиляции.Это невозможно, потому что API различных приложений Office не имеют общего базового класса.В C ++ это может работать, потому что шаблоны C ++ компилируются в классы, которые оцениваются во время выполнения.Но даже тогда это будет работать только для небольших частей API, потому что они не одинаковы!

1 голос
/ 10 марта 2011

Если у вас есть объекты , dynamic здесь может подойти (для вызова методов, доступа к свойствам и т. Д.), Однако, только применяется к переменным, а не к пространствам имен.

Если вам действительно нужно пространство имен (я не думаю, что вы это делаете), вы можете передать его в виде строки и использовать Activator.CreateInstance(namespace + ".Application").

Однако, читая его - кажется, что требуется только приложение ;возможно:

private void convertDocToHtm2<T>( string filename ) where T : class, new();
{
     dynamic app = new T();
     dynamic doc = app.Documents.Open(fileName);

     // etc
}

и звоните как convertDocToHtm2<Word.Application>(filename)

...