Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过属性强制访问T类型的备份字段_C#_.net - Fatal编程技术网

C# 通过属性强制访问T类型的备份字段

C# 通过属性强制访问T类型的备份字段,c#,.net,C#,.net,假设如下: public class A<T> { private T _field; public T Field { get{ Console.WriteLine("hello"); return _field; } } } 公共A类 { 私人T_场; 公共T场{ 得到{ Console.WriteLine(“你好”); 返回_字段; } } } 假设

假设如下:

public class A<T>
{
    private T _field;
    public T Field {
      get{
             Console.WriteLine("hello");
             return _field;
         }
    }
}
公共A类
{
私人T_场;
公共T场{
得到{
Console.WriteLine(“你好”);
返回_字段;
}
}
}
假设我们用某种类型T实例化了一个(忽略缺少的构造函数)

var myA=newa();
var myField=myA.Field;//这将打印“你好”
myA.Field.someOperations存在于接口();//这也会如此
myField.SomeOperations存在于接口();//我想这也打印“你好”不知何故
即,我想通过属性访问器强制访问支持字段。有什么魔法可以做到这一点吗?
同样可以接受的做法是阻止从属性进行分配,并限制通过myA.Field。[…]进行访问。

您可以使用闭包,但使用起来会很笨拙

var myField=新操作(()=>myA.Field);
var b=myField.Invoke().SomeOperationsExistsOnInterface();

我认为只要
a
公开
t
实例,就没有办法实现这一点。理论上,
A
可以在
T
上进行IL重写,并为
控制台注入IL指令
T的开头。一些操作存在于interface()
,但这将需要大量的工作。仍然无法强制调用方这样做。这比仅仅使用
myA.Field.someOperationsExistsonInterface()
?@41686d6564强制用户不存储到变量中是非常奇怪的用例。如果用户必须以这种方式工作,这是一种糟糕的设计。稍微了解一下赋值是如何工作的,就会让您知道,在CLR中,像在我所知道的任何运行时(C/C++、dotnet、python)中一样,这样的事情是不可能的。那么,这应该是答案(或者可能是注释)。但是说“还有一件事你不能强迫打电话的人去做”并不能真正回答“我如何强迫打电话的人去做X?”的问题。至少这是我的意见。
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