IEntryVisitor
IEntryVisitable is interface for visitable entries.
/// <summary>Visitable entry.</summary>
public interface IEntryVisitable : IEntry
{
/// <summary>Try accept <paramref name="visitor"/>.</summary>
/// <param name="visitor"></param>
/// <param name="response"></param>
/// <returns>True if was visited</returns>
bool Accept<Visitor, Arg>(Visitor visitor, ref Arg response) where Visitor : IEntryVisitor<Arg>;
}
IEntryVisitor is interface for visitors.
/// <summary>Indicates that is entry visitor</summary>
public interface IEntryVisitor { }
/// <summary>Indicates that is entry visitor</summary>
public interface IEntryVisitorT : IEntryVisitor { }
/// <summary>Indicates that is entry visitor</summary>
public interface IEntryVisitor<Arg> : IEntryVisitorT { }
/// <summary>Indicates that is entry visitor</summary>
public interface IEntryReadableVisitorT : IEntryVisitorT { }
/// <summary>Interface for visitor implementations. Upon visitation the visited entry is casted to the entry value.</summary>
/// <typeparam name="Arg"></typeparam>
public interface IEntryReadableVisitor<Arg> : IEntryReadableVisitorT, IEntryVisitor<Arg>
{
/// <summary>Visit <see cref="IEntryReadable{Value}"/>.</summary>
/// <returns>Should visitation continue</returns>
bool Visit<Value>(IEntryReadable<Value> readableEntry, ref Arg response);
}
/// <summary>Indicates that is entry visitor</summary>
public interface IEntryWritableVisitorT : IEntryVisitor { }
/// <summary>Interface for visitor implementations. Upon visitation the visited entry is casted to the entry value.</summary>
/// <typeparam name="Arg"></typeparam>
public interface IEntryWritableVisitor<Arg> : IEntryWritableVisitorT, IEntryVisitor<Arg>
{
/// <summary>Visit <see cref="IEntryWritable{Value}"/>.</summary>
/// <returns>Should visitation continue</returns>
bool Visit<Value>(IEntryWritable<Value> writableEntry, ref Arg response);
}
.Accept() takes visitor and one argument with ref pointer.
// Create entry
IEntryVisitable entry = (IEntryVisitable)new Entry<string>();
// Create visitor
IEntryVisitor<object?> visitor = new Visitor();
// Visit
object? arg = null;
entry.Accept(visitor, ref arg);
class Visitor : IEntryReadableVisitor<object?>
{
public bool Visit<Value>(IEntryReadable<Value> readableEntry, ref object? response)
{
Console.WriteLine(typeof(Value).FullName);
return true;
}
}
Full Example
Full example
using System;
using Avalanche.Service;
public class entry_visitable
{
public static void Run()
{
{
// <01>
// Create entry
IEntryVisitable entry = (IEntryVisitable)new Entry<string>();
// Create visitor
IEntryVisitor<object?> visitor = new Visitor();
// Visit
object? arg = null;
entry.Accept(visitor, ref arg);
// </01>
}
}
// <99>
class Visitor : IEntryReadableVisitor<object?>
{
public bool Visit<Value>(IEntryReadable<Value> readableEntry, ref object? response)
{
Console.WriteLine(typeof(Value).FullName);
return true;
}
}
// </99>
}