The short answer is "no", operators are not objects in C# and even the operator overloading mechanism via static methods seems to be kind of a weak design, so you'd rarely see sexy examples of C# operator overloading.
But, if you're curios, in addition to Reflection already mentioned by Jon, there are a couple more meta-programming mechanisms in .NET, in which operators are represented by objects. You still won't be able to give them any additional attributes or check the precedence, but that's probably the closest thing you can get in .NET to what you describe.
One way is through working with Code DOM, there is a CodeBinaryOperationExpression
class. When you read or create one, you specify the operator using CodeBinaryOperatorType
enum. For example, you can make a method in C# which will in run-time create an expression tree with a dynamically chosen operator, compile it into a lambda and pass back to the caller to be used as a common function.
Another way, opposite to the previous in some sense, is by using the new Roslyn API, which provides code parsing capabilities. You can give some source code to Roslyn, it will turn it into the expression tree and you can write visitors or syntax rewriters to modify that tree. For example, you may go over the tree and substitute all "plus" operators with "minus" operators (or with any code of your choice).
You can find more details and examples here and here.
HTH.