You are here: Advanced Features > db4o Reflection API > Creating your own reflector

Creating your own reflector

By default db4o uses the NetReflector. As alternative you can create your own reflector and use it with db4o. In order to do so you need to implement the IReflector interface. And then pass an instance of your implementation to db4o.

Here's an example of a logging reflector. Its only difference from standard reflector is that information about loaded classes is outputted to console:

internal class LoggerReflector : IReflector
{
    private readonly IReflector readReflector;

    public LoggerReflector()
    {
        this.readReflector = new NetReflector();
    }

    public LoggerReflector(IReflector readReflector)
    {
        this.readReflector = readReflector;
    }

    public void Configuration(IReflectorConfiguration reflectorConfiguration)
    {
        readReflector.Configuration(reflectorConfiguration);
    }

    public IReflectArray Array()
    {
        return readReflector.Array();
    }

    public IReflectClass ForClass(Type type)
    {
        Console.WriteLine("Reflector.forClass({0})", type);
        return readReflector.ForClass(type);
    }

    public IReflectClass ForName(string className)
    {
        Console.WriteLine("Reflector.forName({0})", className);
        return readReflector.ForName(className);
    }

    public IReflectClass ForObject(object o)
    {
        Console.WriteLine("Reflector.forObject(" + o + ")");
        return readReflector.ForObject(o);
    }

    public bool IsCollection(IReflectClass reflectClass)
    {
        return readReflector.IsCollection(reflectClass);
    }

    public void SetParent(IReflector reflector)
    {
        readReflector.SetParent(reflector);
    }

    public object DeepClone(object o)
    {
        return new LoggerReflector((IReflector) readReflector.DeepClone(o));
    }
}
ReflectorExamples.cs: Logging reflector
Friend Class LoggerReflector
    Implements IReflector
    Private ReadOnly readReflector As IReflector

    Public Sub New()
        Me.readReflector = New NetReflector()
    End Sub

    Public Sub New(ByVal readReflector As IReflector) 
        Me.readReflector = readReflector
    End Sub

    Public Sub Configuration(ByVal reflectorConfiguration As IReflectorConfiguration) _
        Implements IReflector.Configuration
        readReflector.Configuration(reflectorConfiguration)
    End Sub

    Public Function Array() As IReflectArray _
        Implements IReflector.Array
        Return readReflector.Array()
    End Function

    Public Function ForClass(ByVal type As Type) As IReflectClass _
        Implements IReflector.ForClass
        Console.WriteLine("Reflector.forClass({0})", type)
        Return readReflector.ForClass(type)
    End Function

    Public Function ForName(ByVal className As String) As IReflectClass _
        Implements IReflector.ForName
        Console.WriteLine("Reflector.forName({0})", className)
        Return readReflector.ForName(className)
    End Function

    Public Function ForObject(ByVal o As Object) As IReflectClass _
        Implements IReflector.ForObject
        Console.WriteLine("Reflector.forObject(" & Convert.ToString(o) & ")")
        Return readReflector.ForObject(o)
    End Function

    Public Function IsCollection(ByVal reflectClass As IReflectClass) As Boolean _
        Implements IReflector.IsCollection
        Return readReflector.IsCollection(reflectClass)
    End Function

    Public Sub SetParent(ByVal reflector As IReflector) _
        Implements IReflector.SetParent
        readReflector.SetParent(reflector)
    End Sub

    Public Function DeepClone(ByVal o As Object) As Object _
        Implements IReflector.DeepClone
        Return New LoggerReflector(DirectCast(readReflector.DeepClone(o), IReflector))
    End Function
End Class
ReflectorExamples.vb: Logging reflector