Принудительный доступ к вспомогательному полю типа T через свойство

#c# #.net

#c# #.net

Вопрос:

Предположим следующее:

 public class A<T>
{
    private T _field;
    public T Field {
      get{
             Console.WriteLine("hello");
             return _field;
         }
    }
}
 

Предположим, что мы создаем экземпляр A с некоторым типом T (игнорируем отсутствующий конструктор).

 var myA = new A<Interface>();

var myField = myA.Field; // This will print "hello"
myA.Field.SomeOperationThatExistsOnInterface(); // So will this

myField.SomeOperationThatExistsOnInterface(); // I would like this to also print "hello" somehow
 

Т.е. я хотел бы принудительно получить доступ к вспомогательному полю через средство доступа к свойству. Какая-нибудь магия для этого?
Также приемлемым было бы запретить присвоение свойства и ограничить доступ через myA.Поле.[…].

Комментарии:

1. Я не думаю, что есть способ добиться этого до тех пор, пока A<T> не будет предоставлен T экземпляр. Теоретически A<T> можно было бы выполнить перезапись IL T и ввести инструкции IL для Console.WriteLine("hello"); начала T.SomeOperationThatExistsOnInterface() , но это будет много работы.

Ответ №1:

Вы можете использовать закрытие, но использование будет неуклюжим

 var myField = new Action(() => myA.Field);
var b = myField.Invoke().SomeOperationThatExistsOnInterface();
 

Комментарии:

1. По-прежнему нет способа заставить вызывающую сторону сделать это. Чем это лучше, чем просто использовать myA.Field.SomeOperationThatExistsOnInterface() ?

2. @41686d6564 это чрезвычайно странный вариант использования, чтобы заставить пользователей не сохранять в переменную . Это плохой дизайн, если пользователям приходилось работать таким образом. Немного знаний о том, как работает присваивание, позволит вам узнать, что такое невозможно в CLR, как и в любой среде выполнения, которую я знаю (C / C , dotnet, python)

3. Ну, тогда это должен быть ответ (или, может быть, комментарий). Но высказывание «вот еще одна вещь, которую вы не можете заставить вызывающую сторону выполнить» на самом деле не является ответом на вопрос «как мне заставить вызывающую сторону выполнить X?» вопрос. По крайней мере, это мое мнение.