栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何获得自定义属性应用到的成员?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何获得自定义属性应用到的成员?

由于在堆栈框架和方法的工作方式方面似乎存在很多困惑,因此下面是一个简单的演示:

static void Main(string[] args){    MyClass c = new MyClass();    c.Name = "MyTest";    Console.ReadLine();}class MyClass{    private string name;    void TestMethod()    {        StackTrace st = new StackTrace();        Stackframe currentframe = st.Getframe(1);        Methodbase method = currentframe.GetMethod();        Console.WriteLine(method.Name);    }    public string Name    {        get { return name; }        set        { TestMethod(); name = value;        }    }}

该程序的输出为:

set_Name

C#中的属性是一种语法糖。它们会在IL中编译为getter和setter方法,并且某些.NET语言甚至可能无法将它们识别为属性-
属性解析完全按照惯例完成,IL规范中实际上没有任何规则。

现在,让我们暂时说一下,您的程序确实有充分的理由要检查其自己的堆栈(并且 很少有
实际的理由要这样做)。为什么在世界上,您希望它对属性和方法的行为有所不同?

属性背后的全部理由是它们是一种元数据。如果您想要其他行为,请将其编码 为属性 。如果一个属性根据它是应用于方法还是属性而具有两种不同的含义-
那么您应该具有 两个属性
。将第一个目标设置为

AttributeTargets.Method
,第二个目标设置为
AttributeTargets.Property
。简单。

但是再次重申,遍历自己的堆栈以从调用方法中获取一些属性充其量是危险的。从某种意义上说,您正在冻结程序的设计,这使任何人都难以扩展或重构。这不是通常使用属性的方式。一个更
合适的 示例将是诸如validation属性之类的东西:

public class Customer{    [Required]    public string Name { get; set; }}

然后,您对传入的实际实体一无所知的验证器代码可以执行以下操作:

public void Validate(object o){    Type t = o.GetType();    foreach (var prop in        t.GetProperties(BindingFlags.Instance | BindingFlags.Public))    {        if (Attribute.IsDefined(prop, typeof(RequiredAttribute)))        { object value = prop.GetValue(o, null); if (value == null)     throw new RequiredFieldException(prop.Name);        }    }}

换句话说,您正在检查 提供给您实例 的属性,但您不一定对该 实例 的类型一无所知。XML属性,数据协定属性,甚至是属性属性-.NET
framework中的几乎所有属性都以这种方式使用,以实现某些功能,这些功能相对于 实例类型 是动态的,而不是相对于 程序状态
或堆栈上发生了什么。在创建堆栈跟踪时,实际上不太可能由您来控制。

因此,我将再次建议您 不要 使用堆栈遍历方法,除非您有非常充分的理由这样做(而您尚未告诉我们)。否则,您很可能会陷入痛苦的世界。

如果您绝对必须(不要说我们没有警告您),则使用两个属性,一个可以应用于方法,另一个可以应用于属性。我认为您会发现,与单个超级属性相比,使用它要容易得多。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/378782.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号