2013-05-12 10 views
1

Это было связано с тем, что библиотеки для утиной печати, которые я могу найти для C#, все разрушают идентификатор объекта, то есть Object.ReferenceEquals возвращает false для объекта с утиным шрифтом и его исходного объекта.Библиотека утиной для C#, которая не нарушает идентификатор объекта?

У меня возникло ощущение, что на C# невозможно получить решение с оболочкой/прокси-меньшим, но надеясь, что я ошибаюсь, кто-нибудь знает библиотеку, которая не нарушает эту принципиальную концепцию OO?

Edit, пример кода было предложено:

public class MyClass 
{ 
    private SomeInterface _someInterface; 

    // Dynamic is possible here but the type safety is helpful 
    // when having multiple constructors, for example. 
    public MyClass(AnotherClass c) 
    { 
     _someInterface = c.ActLike<SomeInterface>(); 
     Trace.Assert(object.ReferenceEquals(c, _someInterface)); 
    } 
} 
+4

Не могли бы вы привести пример того, чего вы на самом деле пытаетесь достичь? Например, не могли бы вы просто использовать 'dynamic' из C# 4? –

+2

Я с @Jon. Dynamic - это метафорическая метка утки .net, она, конечно же, не вызовет object.ReferenceEquals сбой. –

+2

@TonyHopkinson :) «Я с Джоном» ... Конечно, вы есть, кто нет :) Это Джон :))) –

ответ

1

Из того, что я понимаю, учитывая ссылку на объект, тип которого неизвестен, но, как ожидается, иметь метод Quack с заданной сигнатурой, вы хотите создать что-то с помощью метода Quack подобной подписи, который вызовет соответствующий метод в исходном объекте. Вы также желаете, чтобы последний объект сравнивал ссылочную-равную оригиналу. То, что вы ищете, невозможно.

Вы можете, однако, быть в состоянии определить метод с Quack расширения либо на Object или универсального типа, который будет рассматривать тип своего аргумента, увидеть, если он имеет метод Quack и назвать его, если так. Каждому сигналу, представляющему интерес, потребуется отдельный шаблонный метод, но, вероятно, возможно, что они будут сжиматься до примерно 4-5 строк кода шаблона за штуку (вызывая общий метод использования Reflection для поиска соответствующего элемента в типе и кешировать результат).

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

  • Нет связанных вопросов^_^