IConstructorDescription
IConstructorDescription description of constructor.
/// <summary>Constructor description</summary>
public interface IConstructorDescription : IAnnotable
{
/// <summary>
/// Describes record constructor method:
/// <see cref="ConstructorInfo"/>
/// <see cref="MethodInfo"/>
/// <see cref="Delegate"/>
/// <![CDATA[IWriterBase]]> as <see cref="ValueType"/>
/// <![CDATA[EmitLine]]> (e.g. (OpCodes.Newobj, ci), (OpCodes.Initobj, ValueType) )
/// <![CDATA[IEnumerable<EmitLine>]]>.
/// </summary>
object Constructor { get; set; }
/// <summary>Record type</summary>
Type Type { get; set; }
/// <summary>Parameters</summary>
IParameterDescription[] Parameters { get; set; }
/// <summary>Record which constructor is member of.</summary>
IRecordDescription? Record { get; set; }
}
ConstructorDescriptor is the default implementation.
IConstructorDescription constructorDescription = new ConstructorDescription
{
Constructor = null!,
Type = typeof(MyClass),
Parameters = new IParameterDescription[0],
Annotations = new object[0],
Record = null
}.SetReadOnly();
Extension methods can be used to set each field.
IConstructorDescription constructorDescription =
new ConstructorDescription()
.SetConstructor(null!)
.SetType(typeof(MyClass))
.SetParameters(new IParameterDescription[0])
.SetAnnotations(new object[0])
.SetRecord(null)
.SetReadOnly();
.Clone() makes a copy.
IConstructionDescription clone = constructionDescription.Clone().SetReadOnly();
.Read() assigns constuctor description from ConstructorInfo, MethodInfo, Delegate, EmitLine, IEnumerable<EmitLine>. Note that MethodInfo can be static or non-static.
// 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();
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 constructordescription
{
public static void Run()
{
{
// <01>
IConstructorDescription constructorDescription = new ConstructorDescription
{
Constructor = null!,
Type = typeof(MyClass),
Parameters = new IParameterDescription[0],
Annotations = new object[0],
Record = null
}.SetReadOnly();
// </01>
}
{
// <02>
IConstructorDescription constructorDescription =
new ConstructorDescription()
.SetConstructor(null!)
.SetType(typeof(MyClass))
.SetParameters(new IParameterDescription[0])
.SetAnnotations(new object[0])
.SetRecord(null)
.SetReadOnly();
// </02>
// <03>
IConstructorDescription clone = constructorDescription.Clone().SetReadOnly();
// </03>
}
{
// <04>
// Create delegate ctor
Func<int, MyClass> ctor = (int value) => new MyClass(value);
// Read info into description
IRecordDescription recordDescription = new RecordDescription().Read(typeof(MyClass));
// Create constructor description from delegate
IConstructorDescription constructorDescription = new ConstructorDescription().SetRecord(recordDescription).Read(ctor);
// </04>
}
}
// <06>
public class MyClass
{
public readonly int value;
public MyClass(int value)
{
this.value = value;
}
}
// </06>
}