好吧,所以在我玩了几个小时之后无所事事,我建立了一个模型:
[AttributeUsage(AttributeTargets.All)]
public class PublicAttribute : System.Attribute
{
public enum Access { Public, Private }
public PublicAttribute(string Name, Access acs)
{
}
public PublicAttribute(string Name, Access acs, Action get, Action set)
{
}
}
所以,如果有人做这样的事情:
[Public("PublicProperty", PublicAttribute.Access.Public)]
private string PrivateProperty = "hello";
或
[Public("PublicProperty", PublicAttribute.Access.Public, ()=>{return PrivateProperty;}, ()=>{PrivateProperty = value})]
private string PrivateProperty = "hello";
然后如果有人试图访问PrivateProperty,他们可以去:
ContainingClass.PublicProperty = // ect
“公物”。这是因为属性,它将使用那些get / set访问器。
我想知道的事情:
答案 0 :(得分:4)
基本上对所有3都不,因为C#是一种强类型语言。即使用鸭子打字,你想要达到的也不符合语言。
您编写的属性允许您查询在类中具有这些属性的属性,但您仍需要使用Reflection来发现属性类的哪些属性已设置。您要使用的语法在编译时检查。
答案 1 :(得分:1)
不,使用属性是不可能的。属性是C#编译器发出的类元数据的一部分,C#编译器不考虑自定义属性。
您可以通过使用后处理器(如PostSharp)来执行此操作,PostSharp可以在事后重写您的程序集,并且可以被指示考虑自定义属性。但是,您仍然无法在属性中包含委托:可以存储在属性状态中的类型集非常有限。
答案 2 :(得分:0)
微软以WebMethodAttribute的方式让人联想到你想要描述的内容,使其代表比C#public
更多的权限,从而有效地使应用程序域外的方法可用于整个互联网(一个非常全球化的范围)。您可能会阅读它以获得真正的实施见解和想法。
但是你很简单。您必须对一些基础设施进行编程才能使其正常运行。它不是自动的,您无法访问Microsoft的所有详细信息源代码。