在 .NET 4.0 中使用 .NET 4.5 中新增的特性(CallerMemberNameAttribute/CallerFilePathAttribute/CallerLineNumberAttribute)

介绍

标题中所说的三个特性 CallerMemberNameAttribute / CallerFilePathAttribute / CallerLineNumberAttribute 我们统称为调用者信息特性,正常情况下在 .NET Framework 4.0 中是无法使用的。因为这三个特性是 .NET Framework 4.5 中新增的。然而这三个特性的作用只是请求编译器在编译过程中进行代码的转换。

使用示例

    static void Main( string[] args )
    {
        var productInfo = new ProductInfo();

        productInfo.Name = "lumia";

        productInfo.PropertyChanged();

        Console.ReadKey( true );
    }
}

public class ProductInfo
{
    private string _name;

    public string Name
    {
        get { return this._name; }
        set
        {
            this._name = value;
            this.PropertyChanged();
        }
    }

    public void PropertyChanged([CallerMemberName]string name = "", [CallerLineNumber]int line = 0, [CallerFilePath]string file = "")
    {
        Console.WriteLine("------------------------------------------------");
        Console.WriteLine($"Name : {name}, \nLine : {line}, \nPath : {file}");
    }
}

注意上面标为橘红色的语句。运行时将自动填充这三个可选参数的值。开发过 WPF 的同学都知道这是多么的方便,不用显示指定参数名称。然而入我上面所说他不能在 .NET Framework 4.0 中使用,不过还好有办法。很简单,我们只需要自己定义这三个特性就可以了,代码如下。

namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
    public class CallerMemberNameAttribute : Attribute
    {

    }

    [AttributeUsage(AttributeTargets.Parameter, Inherited = false )]
    public class CallerFilePathAttribute : Attribute
    {

    }

    [AttributeUsage(AttributeTargets.Parameter, Inherited = false )]
    public class CallerLineNumberAttribute : Attribute
    {

    }
}

没有什么参数和成员在这三个特性里面。但要注意命名空间一定要与上面的一样。

时间: 2024-11-05 16:08:53

在 .NET 4.0 中使用 .NET 4.5 中新增的特性(CallerMemberNameAttribute/CallerFilePathAttribute/CallerLineNumberAttribute)的相关文章

在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数)

//在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数) function formatNum(num, n) {//参数说明:num 要格式化的数字 n 保留小数位 num = String(num.toFixed(n)); var re = /(-?\d+)(\d{3})/; while (re.test(num)) num = num.replace(re, "$1,$2") ret

VB 6.0中判断是否Access 2010中存在指定表格

问题 最近在工作中遇到使用VB6判断是否ACCESS 2010数据库中是否存在指定表格的问题.对于早期ACCESS数据库(应当主要是ACCESS 2003及以前版本),使用DAO引擎操作是没有问题的.主要相关代码如下: For Each mytable In mydatabase.TableDefs    print mytable.nameNext 但是,DAO技术已经不适用于ACCESS 2010了.为此,我使用BAIDU搜索,初步得到的一个方法如下: cn2.Open "Provider=

warning MSB3162: 所选的“Microsoft Report Viewer 2012 Runtime”项需要“Microsoft.SqlServer.SQLSysClrTypes.11.0”。在“系统必备”对话框中选择缺少的系统必备组件,或者为缺少的系统必备组件创建引导程序包。

warning MSB3162: 所选的"Microsoft Report Viewer 2012 Runtime"项需要"Microsoft.SqlServer.SQLSysClrTypes.11.0".在"系统必备"对话框中选择缺少的系统必备组件,或者为缺少的系统必备组件创建引导程序包. 发布ReportViewer程序遇到这个问题. 到处查了下,发现解决方法是这样的. 1)打开这个路径下的xml文件: C:\Program Files (x

【翻译自mos文章】升级到11.2.0.4之后在alert日志中出现 NUMA 警告信息

注:与本文有关的文章为:http://blog.csdn.net/msdnchina/article/details/43763927 升级到11.2.0.4之后在alert日志中出现 NUMA 警告信息 翻译自mos文章:NUMA warning message appear after upgrade to 11.2.0.4 (文档 ID 1600824.1)1 适用于: Oracle Database - Enterprise Edition - Version 11.2.0.4 and

find中的-print0和xargs中-0的奥妙【转】

find cygnus/firmware_cygnus/target/linux/brcm5830/files/arch/arm/mach-iproc/pm_iproc/ -name "*.c" -print | xargs grep "USB" 原文地址:find中的-print0和xargs中-0的奥妙作者:改变自己 默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('n'), 因此我们看到的 find 的输出都是一行一行的: [bash

find中的-print0和xargs中-0的奥妙

原文地址:find中的-print0和xargs中-0的奥妙作者:改变自己 默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('n'), 因此我们看到的 find 的输出都是一行一行的: [bash-4.1.5] ; ls -l total 0 -rw-r--r-- 1 root root 0 2010-08-02 18:09 file1.log -rw-r--r-- 1 root root 0 2010-08-02 18:09 file2.log [bash-4.1.5

Extjs4.0+HSSFWorkbook+SpringMVC实现将数据库中的记录导出到本地Excel格式

Extjs4.0+HSSFWorkbook+SpringMVC实现将数据库中的记录导出到本地Excel格式 自己封装的JS类Share.js var Share = {}; Share.ExportByExcel = function(url) { var appWindow = Share.getWin(); appWindow.open(url); appWindow.focus(); }; 调用的前端js buttons : [{ text : '查询', handler : queryS

C# 6.0:在catch和finally中使用await

Asyn方法是一个现在很常用的方法,当使用async和await时,你或许曾有这样的经历,就是你想要在catch块或finally块中使用它们,比如当出现一个exception而你希望将日志记在文件或者调用一个服务将exception信息发送给server,而这些操作可能很耗时.这种情况下,在catch块中的异步方法中使用await将会很有帮助.而这已经被添加到了C# 6.0 中. 在finally块中也一样,我们也可以使用await来调用async 方法. 下面的代码块显示了怎么用它们. pu

[译]C#8.0中一个使接口更加灵活的新特性-默认接口实现

9月份的时候,微软宣布正式发布C#8.0,作为.NET Core 3.0发行版的一部分.C#8.0的新特性之一就是默认接口实现.在本文中,我们将一起来聊聊默认接口实现. 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/12034584.html 众所周知,对现有应用程序的接口进行更改是一项很危险的操作. 如果这个接口又在多个项目中使用了,那么进行更改将需要付出更多的精力,以确保它不会在其他地方运行失败. 如果该项目是一个小项目,那么我们可以很容易地识别