IConstructionDescription
IConstructionDescription description of how to apply source values on IConstructorDescription and fields.
/// <summary>Description of how to apply <see cref="IConstructorDescription"/>, a constructor-parameter-to-field correlaton.</summary>
public interface IConstructionDescription
{
/// <summary>Constructor to match</summary>
IConstructorDescription Constructor { get; set; }
/// <summary>Parameters to match to</summary>
IParameterDescription[] Parameters { get; set; }
/// <summary>Fields to match to</summary>
IFieldDescription[] Fields { get; set; }
/// <summary>Constructor Parameter to Record Field correlations</summary>
IDictionary<IParameterDescription, IFieldDescription> ParameterToField { get; set; }
/// <summary>Record Field to Constructo Parameter</summary>
IDictionary<IFieldDescription, IParameterDescription> FieldToParameter { get; set; }
/// <summary>Unmatched constructor parameters</summary>
IList<IParameterDescription> UnmatchedParameters { get; set; }
/// <summary>Unmatched constructor fields</summary>
IList<IFieldDescription> UnmatchedFields { get; set; }
}
ConstructionDescriptor is the default implementation.
IConstructionDescription constructionDescription = new ConstructionDescription()
{
Constructor = null!,
Parameters = new IParameterDescription[0],
Fields = new IFieldDescription[0],
ParameterToField = null!,
FieldToParameter = null!,
UnmatchedParameters = new IParameterDescription[0],
UnmatchedFields = new IFieldDescription[0]
}.SetReadOnly();
Extension methods can be used to set each field.
IConstructionDescription constructionDescription =
new ConstructionDescription()
.SetConstructor(null!)
.SetParameters(new IParameterDescription[0])
.SetFields(new IFieldDescription[0])
.SetUnmatchedParameters(new IParameterDescription[0])
.SetUnmatchedFields(new IFieldDescription[0])
.SetReadOnly();
.Clone() makes a copy.
IConstructionDescription clone = constructionDescription.Clone().SetReadOnly();
.CreateConstructionDescription() converts IConstructorDescription to construction description.
// Create delegate ctor
Func<int, MyClass> ctor = (int value) => new MyClass(value);
//
IRecordDescription recordDescription = new RecordDescription().Read(typeof(MyClass));
// Create constructor description from delegate
IConstructorDescription constructorDescription = new ConstructorDescription().SetRecord(recordDescription).Read(ctor);
// Create construction description
IConstructionDescription constructionDescription = constructorDescription.CreateConstructionDescription();
.Score() creates comparable heuristic on applicability of constructor.
int score = constructionDescription.Score();
public class MyClass
{
public readonly int value;
public MyClass(int value)
{
this.value = value;
}
}
Full Example
Full example
using System;
using Avalanche.Utilities;
using Avalanche.Utilities.Record;
class constructiondescription
{
public static void Run()
{
{
// <01>
IConstructionDescription constructionDescription = new ConstructionDescription()
{
Constructor = null!,
Parameters = new IParameterDescription[0],
Fields = new IFieldDescription[0],
ParameterToField = null!,
FieldToParameter = null!,
UnmatchedParameters = new IParameterDescription[0],
UnmatchedFields = new IFieldDescription[0]
}.SetReadOnly();
// </01>
}
{
// <02>
IConstructionDescription constructionDescription =
new ConstructionDescription()
.SetConstructor(null!)
.SetParameters(new IParameterDescription[0])
.SetFields(new IFieldDescription[0])
.SetUnmatchedParameters(new IParameterDescription[0])
.SetUnmatchedFields(new IFieldDescription[0])
.SetReadOnly();
// </02>
// <03>
IConstructionDescription clone = constructionDescription.Clone().SetReadOnly();
// </03>
}
{
// <04>
// Create delegate ctor
Func<int, MyClass> ctor = (int value) => new MyClass(value);
//
IRecordDescription recordDescription = new RecordDescription().Read(typeof(MyClass));
// Create constructor description from delegate
IConstructorDescription constructorDescription = new ConstructorDescription().SetRecord(recordDescription).Read(ctor);
// Create construction description
IConstructionDescription constructionDescription = constructorDescription.CreateConstructionDescription();
// </04>
// <05>
int score = constructionDescription.Score();
// </05>
}
}
// <06>
public class MyClass
{
public readonly int value;
public MyClass(int value)
{
this.value = value;
}
}
// </06>
}