Is the CallerMemberName attribute in 4.5 “able to

2019-01-08 20:51发布

问题:

So .NET 4.5 introduces the CallerMemberNameAttribute, which seems like a godsend to anyone working with WPF and implementing INotifyPropertyChanged - my question is this: Is the attribute intrinsically tied/supported by the 4.5 5.0 compiler, or is it more of a syntactical sugar helper by the environment, much like one could fake out Visual Studio by declaring an ExtensionAttribute of your own, magically turning on LINQ syntax?

Edit: (sorry Jon!) I guess I'm asking if one can "enable" the functionality of the CallerMemberNameAttribute in .NET 4.0 via redeclaration of the attribute in the proper namespace, much like one can "enable" LINQ query syntax in .NET 2.0 by proper declaration of the ExtensionAttribute class. My strong suspicion is no, naturally...

Put yet another way: I want to know if I can benefit from the functionality of CallerMemberName without upgrading to .NET 4.5/5

Hopefully that's more clear...

NinjaEdit #2: Sigh...version numbering conventions are confusing!

回答1:

Yes, you can, exactly as you could use LINQ and .NET 2, as you said. I use the following in a .NET 4.0 project with the VS2012 compiler with success:

namespace System.Runtime.CompilerServices {

    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
    public sealed class CallerMemberNameAttribute : Attribute {
    }

}

Be very careful that everyone on the project is using VS2012, otherwise they'll get silent bugs because CallerMemberNameAttribute didn't do anything and null was passed as the parameter default.

Edit 2013-06-28: Consider installing the Microsoft.Bcl NuGet package that provides CallerMemberNameAttribute (and some other classes from .NET 4.5) for .NET 4 and Silverlight rather than doing it manually.