//----------------------------------------------------------------------------------------------------------------------------------------------------- #region Overrides of ImplementationConvention protected override void OnImplementBaseClass(ImplementationClassWriter <TypeTemplate.TBase> writer) { writer.PrimaryConstructor("Target", out m_TargetField); writer.AllMethods(where : m => m.DeclaringType != typeof(object)).ImplementPropagate(m_TargetField); writer.AllProperties().ImplementPropagate(m_TargetField); writer.AllEvents().ImplementPropagate(m_TargetField); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- private static void ManuallyImplementLoggingDecorator( ImplementationClassWriter <AncestorRepository.IFewMethods> implementor, Field <List <string> > logField, string logSuffix = "") { var decorator = new ImplementationClassWriter <AncestorRepository.IFewMethods>(implementor.OwnerClass); decorator.AllMethods().ForEachMember(method => new TemplateMethodWriter(method, MethodWriterModes.Decorator, w => { logField.Add(w.Const(w.OwnerMethod.Name + ":BEFORE" + logSuffix)); w.Try(() => { var retVal = w.Proceed <TypeTemplate.TReturn>(); if (!method.Signature.IsVoid) { logField.Add(w.Const(w.OwnerMethod.Name + ":RETVAL" + logSuffix + "=") + retVal.Func <string>(x => x.ToString)); w.Return(retVal); } }).Catch <Exception>(e => { logField.Add(w.Const(w.OwnerMethod.Name + ":ERROR" + logSuffix + "=") + e.Prop(x => x.Message)); w.Throw(); }).Finally(() => { logField.Add(w.Const(w.OwnerMethod.Name + ":AFTER" + logSuffix)); }); })); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected override void OnImplementPrimaryInterface(ImplementationClassWriter<TypeTemplate.TInterface> writer) { _threadLogAppenderField = writer.Field<IThreadLogAppender>("_threadLogAppender"); writer.Constructor<IThreadLogAppender>((w, appender) => _threadLogAppenderField.Assign(appender)); writer.AllMethods().Implement(ImplementLogMethod); writer.AllProperties().Implement( p => p.Get(w => w.Throw<NotSupportedException>("Events are not supported")), p => p.Set((w, value) => w.Throw<NotSupportedException>("Events are not supported"))); writer.AllEvents().Implement( e => e.Add((w, args) => w.Throw<NotSupportedException>("Events are not supported")), e => e.Remove((w, args) => w.Throw<NotSupportedException>("Events are not supported"))); }
//------------------------------------------------------------------------------------------------------------------------------------------------- protected override void OnImplementPrimaryInterface(ImplementationClassWriter <TypeTemplate.TInterface> writer) { writer.AllMethods().ImplementEmpty(); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected override void OnImplementAnyInterface(ImplementationClassWriter <TypeTemplate.TInterface> writer) { writer.AllMethods().ImplementPropagate(m_TargetField.CastTo <TypeTemplate.TInterface>()); writer.AllProperties().ImplementPropagate(m_TargetField.CastTo <TypeTemplate.TInterface>()); writer.AllEvents().ImplementPropagate(m_TargetField.CastTo <TypeTemplate.TInterface>()); }