2015-02-27 4 views
0

Возможно ли определить пользовательское поведение каста прозрачного прокси-сервера в реальном прокси-классе?
Пример:Определить персонализированное литье RealProxy

public class TestProxy : RealProxy 
{ 
    public TestProxy() : base(typeof(MarshalByRefObject)) 
    { 

    } 

    public override IMessage Invoke(IMessage msg) 
    { 
     throw new NotImplementedException(); 
    } 
} 

object proxy = new TestProxy().GetTransparentProxy(); 
Console.WriteLine((string)proxy); 

Этот код бросает System.InvalidCastException: Невозможно бросить прозрачный прокси к типу System.String. Возможно ли обнаружить литье и обработать его в классе TestProxy?

Редактировать: Код, который нужно передать в интерфейс COM, будет достаточным.

+0

Я не думаю, что так. Перехват приведения (с использованием явного оператора) - это функция времени компиляции. Ваш трюк пытается передать из 'object' в' string'. Поэтому, даже если вы реализуете какой-либо оператор преобразования «явный», он не будет работать, поскольку «прокси» вводится как «объект». Компилятор C# должен знать информацию о типе во время компиляции. –

+0

@ Шририм я не согласен. Кастинг от 'объекта' к любому другому типу выполняется с помощью CLR, и, как вы можете видеть, CLR обрабатывает это, бросая очень конкретное исключение. – IllidanS4

+0

Я знаю; может быть, я это неправильно сформулировал, я говорю о том, как перехватывать вызовы. Вы можете реализовать «явный» оператор для его перехвата, но компилятору C# требуется информация о статическом типе, чтобы заставить его работать. Я изменил свой последний комментарий, чтобы иметь смысл. –

ответ

0

Единственный способ, которым я когда-либо мог это сделать, - использовать замок в дополнение к коду Vanilla .NET. Я никогда не обнаруживал, что общедоступные методы и свойства на объектах .NET достаточно надежны для удовлетворения моих потребностей.

Я, как правило, рассматривал это, используя замок Windsor WCF Facility, что означает, что вы должны использовать Castle Windsor для своего DI (или иметь 2 контейнера).

Вы также можете использовать Castle.DynamicProxy сам по себе, как подробно описано здесь: https://msdn.microsoft.com/en-us/magazine/dn574804.aspx

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