Expressions has no IdentityEquality operator

by Alexey Shirshov September 19, 2009 19:17

Vb guys always wonder why c# has no identity equality operator like Is and IsNot. In many cases equality operator == make the job in c#. For instance

object d = "hello!";
bool isString = typeof(string) == d.GetType();

Here is the code in vb.net

Dim d As Object = "hello!"
Dim isString As Boolean = GetType(stringIs d.GetType()
'below is regular language construction
Dim isType As Boolean = GetType(stringIs d

The last statement will not work in c#. The only chance is to use ReferenceEquals method

object d = "hello!";
bool isType = ReferenceEquals(typeof(string), d);

So far so good. The bad news is expressions lack of identity equality operator. There is only one enumeration element in ExpressionType enum represents equality - ExpressionType.Equal. Even in CodeDom there are three: IdentityInequality, IdentityEquality and ValueEquality. So if you want to transform Expressions tree to CodeDom tree like I do, you have to think a lot.

In Expressions to CodeDom I create spesial CodeIdentityEqualityExpression class and CodeDom.Is method to simplify usage.

<TestMethod()> Public Sub TestIsOperator()
   Dim c = New CodeDomGenerator()
   c.AddNamespace("Samples").AddClass("cls") _
      .AddMethod(MemberAttributes.Public Or MemberAttributes.Static, Function() "foo", _
         Emit.declare("d1", Function() CodeDom.Is(String.Empty, GetType(String))), _
         Emit.declare("d2", Function() CodeDom.IsNot(String.Empty, GetType(String))) _
   )
   
   Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp))
   Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB))

   Dim ass = c.Compile()
   Assert.IsNotNull(ass)
   
   Dim TestClass As Type = ass.GetType("Samples.cls")
   Assert.IsNotNull(TestClass)
End Sub

Expressions to CodeDOM

by Alexey Shirshov May 16, 2009 13:05

Over a last month I was involved in Expressions to CodeDOM project. This blog I plan to use to explain some general aspects, usage scenarios and internal mechanisms of the library.

The library consists of five abstractions

  • Define static class
  • Emit static class
  • CodeDom static class
  • Microsoft CodeDOM extesion methods
  • CodeDomGenerator class

Define class using for class, method, property, event, etc declarations. It helps to create CodeTypeMember classes (CodeTypeDeclaration, CodeMemberMethod, etc).

Emit class helps to create various statements as return, if, for, etc. All methods of the class return instances of CodeStatement derived classes.

CodeDom helps to create some statements which cannot be presented in pure lambda functions. It helps to create CodeExpressions too.

Microsoft CodeDOM extesion methods simplify work with CodeDOM.

CodeDomGenerator is a root class, main entry point of the library. Although you can create CodeDOM tree without it, it very helps to store root namespaces, process CodeDOM tree and generate the code.

Powered by BlogEngine.NET 1.4.5.0
Theme by Mads Kristensen | Modified by Mooglegiant

The Author

My name is Alexey Shirshov. I'm a professional developer with wide specialization. I prefer VB.NET to C#, I hate ASP.NET but there is no better than it. You can contact me by this page.