Утиная библиотека для C#, которая не нарушает идентичность объекта?
Меня беспокоит то, что библиотеки для утки, которые я могу найти для C#, нарушают идентичность объекта, т.е. Object.ReferenceEquals
возвращает false для объекта типа "утка" и его исходного объекта.
У меня такое чувство, что в C# невозможно создать решение без оболочки / прокси, но, надеюсь, я ошибаюсь, кто-нибудь знает библиотеку, которая не нарушает эту фундаментальную концепцию ОО?
Изменить, пример кода был запрошен:
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));
}
}
2 ответа
Из того, что я понимаю, дана ссылка на объект, тип которого неизвестен, но, как ожидается, будет иметь Quack
метод с заданной сигнатурой, вы хотите создать что-то с Quack
метод аналогичной подписи, который будет вызывать соответствующий метод в исходном объекте. Вы также хотите, чтобы последний объект сравнивался с эталоном, равным оригиналу. То, что вы ищете, невозможно.
Однако вы можете определить Quack
метод расширения либо на Object
или на универсальном типе, который будет проверять тип своего аргумента, посмотреть, имеет ли он Quack
метод, и назовите его, если так. Каждая интересующая сигнатура метода потребует отдельного шаблонного метода, но, вероятно, их можно будет свести к 4-5 строкам шаблонного кода за штуку (вызывая общий метод для использования Reflection, чтобы найти соответствующий член в типе и кешируем результат).
При точности вашего вопроса ответ на него - нет. Вы не можете.
Object.ReferenceEquals
это прямое сравнение адресов в памяти двух объектов.
Именно по этой причине следующий код записывается в окно консоли, хотя логически вы можете подумать, что он должен писать
True
:
int myVar = 0;
Console.WriteLine(Object.ReferenceEquals(myVar, myVar))
В случае , результат
False
потому что тип значения упакован в экземпляр, который указывает на
myVar
.
Duck Typing сам по себе создает форму рамки вокруг вашего объекта.
Если бы вы реализовали Duck Typing самостоятельно, у вас мог бы быть свой собственный метод, который использует преимущества этого менталитета упаковки и правильно распаковывает оригинал.
object
прежде чем делать
ReferenceEquals
сравнение.