IFieldDescription
IFieldDescription is description of field (namespace Avalanche.Utilities.Record).
/// <summary>Field description</summary>
public interface IFieldDescription : IAnnotable
{
/// <summary>Field name</summary>
object Name { get; set; }
/// <summary>Field type</summary>
Type Type { get; set; }
/// <summary>Describes field writer: <see cref="ParameterInfo"/>, <see cref="FieldInfo"/>, <see cref="PropertyInfo"/>, <see cref="MethodInfo"/>, <see cref="Delegate"/>, <![CDATA[IWriterBase]]>, <![CDATA[IRefererBase]]> or <![CDATA[EmitLine]]></summary>
Object? Writer { get; set; }
/// <summary>Describes field reader: <see cref="FieldInfo"/>, <see cref="PropertyInfo"/>, <see cref="MethodInfo"/>, <see cref="Delegate"/>, <![CDATA[IWriterBase]]>, <![CDATA[IRefererBase]]>, or <![CDATA[EmitLine]]></summary>
Object? Reader { get; set; }
/// <summary>Describes field reader: <see cref="FieldInfo"/></summary>
Object? Referer { get; set; }
/// <summary>Record which field is member of.</summary>
IRecordDescription? Record { get; set; }
/// <summary>Initial value</summary>
Object? InitialValue { get; set; }
}
FieldDescription is the default implementation.
IFieldDescription fieldDescription = new FieldDescription
{
Name = "",
Type = typeof(string),
Writer = null,
Reader = null,
Referer = null,
Annotations = new object[0],
Record = null,
InitialValue = null,
}.SetReadOnly();
There is a setter method for each field.
IFieldDescription fieldDescription =
new FieldDescription()
.SetName("")
.SetType(typeof(string))
.SetWriter(null)
.SetReader(null)
.SetReferer(null)
.SetAnnotations(new object[0])
.SetRecord(null)
.SetInitialValue(null)
.SetReadOnly();
.Clone() makes a copy.
IFieldDescription clone = fieldDescription.Clone().SetReadOnly();
FieldInfo can be used as reader, writer and referer.
FieldInfo fi = typeof(MyClass).GetField("name")!;
IFieldDescription fieldDescription =
new FieldDescription()
.SetName("Name")
.SetType(typeof(string))
.SetReader(fi)
.SetWriter(fi)
.SetReferer(fi)
.SetReadOnly();
PropertyInfo can be used as reader and writer.
PropertyInfo pi = typeof(MyClass).GetProperty("Name")!;
IFieldDescription fieldDescription =
new FieldDescription()
.SetName("Name")
.SetType(typeof(string))
.SetReader(pi)
.SetWriter(pi)
.SetReadOnly();
MethodInfos can be used as reader and writer.
MethodInfo miGet = typeof(MyClass).GetMethod("GetName")!;
MethodInfo miSet = typeof(MyClass).GetMethod("SetName")!;
IFieldDescription fieldDescription =
new FieldDescription()
.SetName("Name")
.SetType(typeof(string))
.SetReader(miGet)
.SetWriter(miSet)
.SetReadOnly();
.Read(object) extension method (namespace Avalanche.Utilities.Record, Avalanche.Utilities.Abstractions.dll) can be used initialize description from FieldInfo, PropertyInfo or ParameterInfo. It also reads annotations.
FieldInfo fi = typeof(MyClass).GetField("name")!;
IFieldDescription fieldDescription = new FieldDescription().Read(fi).SetReadOnly();
FieldDescription.Create is IProvider<Type, IFieldDescription> that creates new description instance.
FieldDescription.Cached is IProvider<Type, IFieldDescription> that creates and caches with weak key.
Example class.FieldInfo fi = typeof(MyClass).GetField("name")!;
IFieldDescription fieldDescription = FieldDescription.Create[fi];
FieldInfo fi = typeof(MyClass).GetField("name")!;
IFieldDescription fieldDescription = FieldDescription.Cached[fi];
public class MyClass
{
public string name = null!;
public string Name { get => name; set => name = value; }
public void SetName(string name) => this.name = name;
public string GetName() => name;
}
Full Example
Full example
using System.Reflection;
using Avalanche.Utilities;
using Avalanche.Utilities.Record;
class fielddescription
{
public static void Run()
{
{
// <01>
IFieldDescription fieldDescription = new FieldDescription
{
Name = "",
Type = typeof(string),
Writer = null,
Reader = null,
Referer = null,
Annotations = new object[0],
Record = null,
InitialValue = null,
}.SetReadOnly();
// </01>
}
{
// <02>
IFieldDescription fieldDescription =
new FieldDescription()
.SetName("")
.SetType(typeof(string))
.SetWriter(null)
.SetReader(null)
.SetReferer(null)
.SetAnnotations(new object[0])
.SetRecord(null)
.SetInitialValue(null)
.SetReadOnly();
// </02>
// <03>
IFieldDescription clone = fieldDescription.Clone().SetReadOnly();
// </03>
}
{
// <04>
FieldInfo fi = typeof(MyClass).GetField("name")!;
IFieldDescription fieldDescription =
new FieldDescription()
.SetName("Name")
.SetType(typeof(string))
.SetReader(fi)
.SetWriter(fi)
.SetReferer(fi)
.SetReadOnly();
// </04>
}
{
// <05>
PropertyInfo pi = typeof(MyClass).GetProperty("Name")!;
IFieldDescription fieldDescription =
new FieldDescription()
.SetName("Name")
.SetType(typeof(string))
.SetReader(pi)
.SetWriter(pi)
.SetReadOnly();
// </05>
}
{
// <06>
MethodInfo miGet = typeof(MyClass).GetMethod("GetName")!;
MethodInfo miSet = typeof(MyClass).GetMethod("SetName")!;
IFieldDescription fieldDescription =
new FieldDescription()
.SetName("Name")
.SetType(typeof(string))
.SetReader(miGet)
.SetWriter(miSet)
.SetReadOnly();
// </06>
}
{
// <07>
FieldInfo fi = typeof(MyClass).GetField("name")!;
IFieldDescription fieldDescription = new FieldDescription().Read(fi).SetReadOnly();
// </07>
}
{
// <08>
FieldInfo fi = typeof(MyClass).GetField("name")!;
IFieldDescription fieldDescription = FieldDescription.Create[fi];
// </08>
}
{
// <09>
FieldInfo fi = typeof(MyClass).GetField("name")!;
IFieldDescription fieldDescription = FieldDescription.Cached[fi];
// </09>
}
}
// <99>
public class MyClass
{
public string name = null!;
public string Name { get => name; set => name = value; }
public void SetName(string name) => this.name = name;
public string GetName() => name;
}
// </99>
}