Click here to Skip to main content
15,039,214 members

Eddy Vluggen - Professional Profile



Summary

    Blog RSS
5,526
Author
84,722
Authority
89,561
Debator
62
Editor
952
Enquirer
16,143
Organiser
11,434
Participant
I'm a Delphi-convert, mostly into WinForms and C#. My first article is from 2001, extending the Delphi-debugger, which is still visible on the WayBackMachine[^] and even available in Russian[^] Smile | :)
31 Dec 2018 CodeProject MVP 2019
31 Dec 2012 MVP: CodeProject MVP 2013
31 Dec 2009 CodeProject MVP 2010

 

Groups

Below is the list of groups in which the member is participating

CodeProject Beta Testers
United States United States
No Biography provided
Group type: Collaborative Group
This member has Member status in this group

138 members

Reputation

Weekly Data. Recent events may not appear immediately. For information on Reputation please see the FAQ.

Privileges

Members need to achieve at least one of the given member levels in the given reputation categories in order to perform a given action. For example, to store personal files in your account area you will need to achieve Platinum level in either the Author or Authority category. The "If Owner" column means that owners of an item automatically have the privilege. The member types column lists member types who gain the privilege regardless of their reputation level.

ActionAuthorAuthorityDebatorEditorEnquirerOrganiserParticipantIf OwnerMember Types
Have no restrictions on voting frequencysilversilversilversilver
Bypass spam checks when posting contentsilversilversilversilversilversilvergoldSubEditor, Mentor, Protector, Editor
Store personal files in your account areaplatinumplatinumSubEditor, Editor
Have live hyperlinks in your profilebronzebronzebronzebronzebronzebronzesilverSubEditor, Protector, Editor
Have the ability to include a biography in your profilebronzebronzebronzebronzebronzebronzesilverSubEditor, Protector, Editor
Edit a Question in Q&AsilversilversilversilverYesSubEditor, Protector, Editor
Edit an Answer in Q&AsilversilversilversilverYesSubEditor, Protector, Editor
Delete a Question in Q&AYesSubEditor, Protector, Editor
Delete an Answer in Q&AYesSubEditor, Protector, Editor
Report an ArticlesilversilversilversilverSubEditor, Mentor, Protector, Editor
Approve/Disapprove a pending ArticlegoldgoldgoldgoldSubEditor, Mentor, Protector, Editor
Edit other members' articlesSubEditor, Protector, Editor
Create an article without requiring moderationplatinumSubEditor, Mentor, Protector, Editor
Approve/Disapprove a pending QuestionProtector
Approve/Disapprove a pending AnswerProtector
Report a forum messagesilversilverbronzeProtector, Editor
Approve/Disapprove a pending Forum MessageProtector
Create a new tagsilversilversilversilver
Modify a tagsilversilversilversilver

Actions with a green tick can be performed by this member.


 
GeneralBookmarks Pin
Eddy Vluggen18-Mar-11 4:14
professionalEddy Vluggen18-Mar-11 4:14 
GeneralRelated Utilities Pin
Eddy Vluggen2-Mar-12 12:10
professionalEddy Vluggen2-Mar-12 12:10 
NewsOnline tools Pin
Eddy Vluggen14-Mar-12 8:21
professionalEddy Vluggen14-Mar-12 8:21 
NewsCustom Controls / Libraries Pin
Eddy Vluggen9-Apr-12 9:54
professionalEddy Vluggen9-Apr-12 9:54 
NewsDebugging Pin
Eddy Vluggen26-Apr-12 22:02
professionalEddy Vluggen26-Apr-12 22:02 
NewsDesign Patterns Pin
Eddy Vluggen17-Jun-12 0:25
professionalEddy Vluggen17-Jun-12 0:25 
GeneralRefactorings Pin
Eddy Vluggen7-Oct-10 12:55
professionalEddy Vluggen7-Oct-10 12:55 
GeneralRe: Refactorings Pin
Vercas26-Dec-10 5:31
MemberVercas26-Dec-10 5:31 
News.NET related snippets Pin
Eddy Vluggen5-Oct-10 9:58
professionalEddy Vluggen5-Oct-10 9:58 
GeneralTemporaryOverride class Pin
Eddy Vluggen5-Oct-10 10:15
professionalEddy Vluggen5-Oct-10 10:15 
Sometimes you'd temporarily want to change the value of a variable, and the most common pattern is probably the one below;
string temp = someObject.SomeValue;
someObject.SomeValue = "Updating, call again later";
try
{
    // do stuff
}
finally
{
    someObject.SomeValue = temp;
}

I'm currently working in VB.NET, and it would seem like a dandy idea to be able to do something like the pattern below;
Imports System
Imports SubSystem

Public Class SomeLogger
    Public CategoryName As String = "None Specified"
    Public Sub DoLog(ByVal SomeText As String)
        Console.WriteLine("{0}:    {1}", CategoryName, SomeText)
    End Sub
End Class

Public Class Application
    Public Shared Logger As New SomeLogger

    Public Shared Sub Main()
                
        Logger.DoLog("Hello World")

        Using Temporary.Override(Logger, "CategoryName", "Sub Main")
        
            Logger.DoLog("Hello World")
            
        End Using

        Logger.DoLog("Hello World")
        
    End Sub
End Class


Well, that's possible. Temporary is a static class, returning an IDisposable that wraps the property on said object. When the computer leaves the Using statement, the IDisposable will reflect the original value back, even if we exit the procedure by throwing a new exception.

The actual implementation as a reference;
using System;
using System.Collections;
using System.Reflection;
using System.IO;
using System.ComponentModel;

namespace SubSystem
{
    public class Temporary
    {
        public static IDisposable Override (Object aObject, String aMemberName, Object aScopedValue)
        {
            return init (aMemberName, aObject.GetType (), aObject, aScopedValue);
        }
        public static IDisposable Override (Type aType, String aMemberName, Object aScopedValue)
        {
            return init (aMemberName, aType, null, aScopedValue);
        }
        
        static IDisposable init (String aMemberName, Type aType, Object aObject, Object aScopedValue)
        {
            MemberInfo memberInfo = aType.GetMember (aMemberName)[0];
            
            switch (memberInfo.MemberType) 
            {
                case MemberTypes.Property:
                    return new TemporaryOverrideProperty (
                        aObject == null ? aType : aObject, 
                        (PropertyInfo)memberInfo, 
                        aScopedValue);
    
                case MemberTypes.Field:
                    return new TemporaryOverrideField (
                        aObject == null ? aType : aObject, 
                        (FieldInfo)memberInfo, 
                        aScopedValue);
    
                default:
                    throw new NotSupportedException ();
            }
        }
    }


    public class TemporaryOverrideProperty : TemporaryOverride
    {
        PropertyInfo _overridenProperty;

        public TemporaryOverrideProperty(Object aObject, PropertyInfo aProperty, Object aScopedValue)
        {
            this._sourceObject = aObject;
            this.init(aProperty, aScopedValue);
        }
        public TemporaryOverrideProperty(Type aSource, PropertyInfo aProperty, Object aScopedValue)
        {
            this._sourceClass = aSource;
            this.init(aProperty, aScopedValue);
        }

        ~TemporaryOverrideProperty()
        {
            this.Dispose(false);
        }

        void init(PropertyInfo aProperty, Object aScopedValue)
        {
            this._overridenProperty = aProperty;
            this._originalValue = this._overridenProperty.GetValue(this._sourceObject, null);
            this._overridenProperty.SetValue(this._sourceObject, aScopedValue, null);
        }

        protected override void Dispose(Boolean disposing)
        {
            if (disposing)
            {
                this._overridenProperty.SetValue(this._sourceObject, this._originalValue, null);
            }
            base.Dispose(disposing);
        }
    }
    public class TemporaryOverrideField : TemporaryOverride
    {
        FieldInfo _overridenField;

        public TemporaryOverrideField(Object aObject, FieldInfo aField, Object aScopedValue)
        {
            this._sourceObject = aObject;
            this.init(aField, aScopedValue);
        }
        public TemporaryOverrideField(Type aSource, FieldInfo aField, Object aScopedValue)
        {
            this._sourceClass = aSource;
            this.init(aField, aScopedValue);
        }

        ~TemporaryOverrideField()
        {
            this.Dispose(false);
        }

        void init(FieldInfo aField, Object aScopedValue)
        {
            this._overridenField = aField;
            this._originalValue = this._overridenField.GetValue(this._sourceObject);
            this._overridenField.SetValue(this._sourceObject, aScopedValue);
        }

        protected override void Dispose(Boolean disposing)
        {
            if (disposing)
            {
                this._overridenField.SetValue(this._sourceObject, this._originalValue);
            }
            base.Dispose(disposing);
        }
    }

    public class TemporaryOverride : IDisposable
    {
        protected Object _sourceObject;
        protected Type _sourceClass;
        protected Object _originalValue;
        
        protected TemporaryOverride()
        {
        }

        #region IDisposable implementation (MSDN adapted version)
        Boolean disposed = false;

        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(Boolean disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    // Dispose managed resources.
                }

                // Call the appropriate methods to clean up
                // unmanaged resources here.

                // Note disposing has been done.
                this.disposed = true;
            }
        }
        #endregion
    }
}

I are Troll Suspicious | :suss:

NewsTemporaryOverride class (VB.NET version) Pin
Eddy Vluggen22-Jul-11 4:30
professionalEddy Vluggen22-Jul-11 4:30 
NewsScopedSupportInitialize Pin
Eddy Vluggen10-Apr-12 8:35
professionalEddy Vluggen10-Apr-12 8:35 
GeneralA clean CreateDelegate Pin
Eddy Vluggen13-Apr-11 10:04
professionalEddy Vluggen13-Apr-11 10:04 
NewsInterop with .NET, tested with Lazarus; Pin
Eddy Vluggen13-Sep-11 12:32
professionalEddy Vluggen13-Sep-11 12:32 
NewsStandard reader-pattern Pin
Eddy Vluggen29-Oct-11 14:31
professionalEddy Vluggen29-Oct-11 14:31 
NewsAttributionAttribute AboutBox Pin
Eddy Vluggen29-Oct-11 14:55
professionalEddy Vluggen29-Oct-11 14:55 
NewsMy BigInt implementation Pin
Eddy Vluggen11-Nov-11 7:20
professionalEddy Vluggen11-Nov-11 7:20 
NewsExpensive Exceptions Pin
Eddy Vluggen19-Sep-16 1:03
professionalEddy Vluggen19-Sep-16 1:03 
GeneralRe: Expensive Exceptions Pin
PIEBALDconsult16-May-18 15:06
professionalPIEBALDconsult16-May-18 15:06 
GeneralRe: Expensive Exceptions Pin
Eddy Vluggen16-May-18 22:43
professionalEddy Vluggen16-May-18 22:43 
GeneralTSQL: Fetch metadata for a table Pin
Eddy Vluggen6-Sep-10 9:54
professionalEddy Vluggen6-Sep-10 9:54 
GeneralTSQL: Fetch tables without Primary Key Pin
Eddy Vluggen31-Jan-11 1:36
professionalEddy Vluggen31-Jan-11 1:36 
GeneralTSQL: Fetch tables without clustered index Pin
Eddy Vluggen1-Feb-11 21:04
professionalEddy Vluggen1-Feb-11 21:04 
GeneralRe: TSQL: Fetch metadata for a table Pin
PIEBALDconsult16-May-18 15:08
professionalPIEBALDconsult16-May-18 15:08 
GeneralVisual Studio macro's: replacing the default help-system Pin
Eddy Vluggen2-Sep-10 9:49
professionalEddy Vluggen2-Sep-10 9:49 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.