Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compile Time Reflection in C#

Tags:

I frequently write C# code that has to use magic strings to express property names. Everyone knows the problems with magic strings. They are very difficult to refactor, they have no compile time checking, and often they lead to hard-to-diagnose issues. Yet C#/.NET uses them all over the place to represent property/class/method names.

This issue has persisted for years and years, and the only viable solution currently is to use an expression tree which is then parsed at run-time for the property name. This gets you satisfactory compile-time checking, but it complicates the code (requiring parameters of type Expression), and it incurs a run-time cost.

Does anyone know if there has ever been a feature consideration for C#/.NET to add compile-time reflection to overcome this pervasive problem?

It seems like it would be an easy addition to make, it would be a non-breaking change, and it would greatly benefit many developers. The typeof() operator already performs a form of compile-time reflection, so it seems like an operator nameof() (or something similar) would be very complimentary.

In addition, does anyone know of any potential issues with such a feature?

Thanks for the help.

like image 312
MgSam Avatar asked Feb 17 '12 20:02

MgSam


People also ask

What is compile time reflection?

Compile-time reflection is a powerful way to develop program transformers and generators, while runtime reflection is typically used to adapt the language semantics or to support very late binding between software components. Until 2.10, Scala has not had any reflection capabilities of its own.

What is static reflection?

Reflection lets one examine objects and their properties in a program at runtime. Typically, this is provided by a runtime.

Does C++ have reflection?

Reflection is supported through the common language runtime, not by the Microsoft C++ compiler. Although you used this code to inspect an assembly that you defined, you can also use this code to inspect .

What is reflection C++?

Reflection is a mechanism in programming to implement generic code that can work for all types of objects. It helps recognizing the format for the objects at runtime and invoke the methods of that object and access the fields of these objects.


2 Answers

Straight from the source - this is a blog post by a C# language designer, and the "User" in this post asks about the same questions as you and is answered. The author says there would be a need to specify a syntax for every metadata item you'd want to ask for and it's not trivial - ie. which overload you want, if you want "info-of" method and the method is overloaded? What if there are generics and explicit interface implementations involved? And so on. It turns out, while it wasn't deemed worthy of implementation in 2009 because of those reasons, we will get it in C# 6 in 2015 - see C# Language Design Notes for Jul 9, 2014 .

like image 53
cynic Avatar answered Sep 24 '22 04:09

cynic


In C# 6.0, a new operator, nameof, is being added that will allow you to get the names of properties, classes, fields, events, and variables at compile time.

Link to the design notes

No more reflection for information the compiler already knows at design time!

like image 45
MgSam Avatar answered Sep 25 '22 04:09

MgSam