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