Using LINQ to write constraints in OCL style v2


Based on Michael Giagnocavo’s feedback, here’s a cleaner version of my last post. Thanks Michael.


[ValidationState(ValidationState.Enabled)]


public partial class ExampleElement


{


    [ValidationMethod(ValidationCategories.Menu | ValidationCategories.Save)]


    private void TestExampleElement(ValidationContext context)


    {


        var propnames = this.Properties.Select( p => p.Name );


        var distinctnames = propnames.Distinct();


        if (propnames.Count() != distinctnames.Count())


        {


            context.LogError(“Non-unique property names”, “Error 1”);


        }


 


        var subpropnames = this.Properties.SelectMany( p => p.SubProperties ).Select( p => p.Name );


        var distinctsubpropnames = subpropnames.Distinct();


 


        if (subpropnames.Count() != distinctsubpropnames.Count())


        {


            context.LogError(“Non-unique sub property names”, “Error 2”);


        }


    }


}

Comments (3)

  1. I’ve obviously been coding in a dark cell too much of late as there are a few things I’ve just noticed.

  2. Keith Short says:

    Steve, this is great, but introduces an issue concerning tool usability.  As far as I can see, using the declarative set operations in LINQ takes away the capability to identify (at least one of) the items failing the constraint. It’s a nice feature of the DSL Tool Constraint Framework to identify a failing item by association to the task entry. For example, which name is duplicated?

    Any thoughts about this?

  3. I've obviously been coding in a dark cell too much of late as there are a few things I've just