2016-06-17 4 views
0

Я пишу метод утилиты, чтобы очистить ссылку на COM-объект.Общий метод для установки ссылочной переменной в функции вызывающего объекта на нуль

public class ComUtils { 
    public static void ReleaseObj(ref object comObj) 
    { 
     if (comObj != null) 
     { 
      Marshal.FinalReleaseComObject(comObj); 
      comObj = null; 
     } 
    } 
} 

Я хочу, чтобы вызвать этот метод так:

CommandData cmdData; 
//cmdData = Acquire a CommandData object 
ComUtils.ReleaseObj(ref cmdData); 

я получаю ошибку компилятора, который говорит

не может конвертировать из исх CommandData в исй объект

Приведение CommandData в объект потеряет цель общего метода, h должен установить для ссылочной переменной значение null, после ее освобождения.

Есть ли решение? Я использую VS 2005, .NET 2.0

Спасибо.

ответ

0

Вы ищете дженериков:

public static void ReleaseObj<T>(ref T comObj) where T : class 
{ 
    if (comObj != null) 
    { 
     Marshal.FinalReleaseComObject(comObj); 
     comObj = null; 
    } 
} 
+0

Будет ли он работать в .NET 2.0? – AllSolutions

+0

Да; дженерики были введены в 2.0. – SLaks

+0

Ваш ответ отлично работает! Благодарю. Просто подумал об улучшении, например о том, можно ли передавать переменное количество аргументов любого класса по ссылке, например: public static void ReleaseAll (params ref T [] comObj), где T: class. Компилятор говорит, что параметр params не может быть объявлен как ref или out. Есть ли решение в C# 2.0 или, если нет, то в любой другой версии .NET? Я хотел бы называть его следующим: ReleaseAll (obj1, obj2, obj3) и т. Д. – AllSolutions

0

Ваш вопрос конкретно спрашивает «Общий метод принять параметр объекта [...]» акцент мой.

У вас нет общего метода. У вас есть не общий метод. Вы принимаете объект , если хотите принять параметр, где этот параметр равен любого типа, который осуществляется через общий метод. Если вы сделаете метод общим, он будет работать.

+0

Хорошо. Просто из любопытства не является объектом любого класса, назначаемого переменной типа объекта? Я имею в виду, что компилятор позволяет: CommandData cmdData = new CommandData(); а затем объект o = cmdData; не требуя приведения. Почему тогда он настаивает на приведении, когда параметр передается ссылкой на другую функцию? – AllSolutions

+0

@AllSolutions Вы можете присвоить * значение * любого типа переменной * типа 'object'. Когда у вас есть параметр 'ref', аргумент не является * значением *, это * переменная *. Ваша переменная 'CommandData' * * может иметь только присвоенные ей значения CommandData * *, поэтому, если вы рассматривали ее как переменную' object' (которую вы делаете, передавая ее как объект 'ref), тогда вы может назначать объекты, которые не относятся к типу 'CommandData'. – Servy