#region License Information /* HeuristicLab * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Reflection; using HeuristicLab.Persistence.Core; namespace HeuristicLab.Persistence.Core { /// /// Encapsulation and abstraction for access a data member of an object /// regardless of it being a property or field. Additionally a /// default value and an alternate name can be specified. /// public class DataMemberAccessor { /// /// The function to get the value of the data member. /// public readonly Func Get; /// /// The function to set the value of the data member. /// public readonly Action Set; /// /// The name of the data member. /// public readonly string Name; /// /// The default value of the data member, can remain null /// if no default value. If left null, this will also leave the /// default value for value types (e.g. 0 for int). /// public readonly object DefaultValue; /// /// Create a from a FieldInfo or /// PropertyInfo for the give object. /// /// The member info. /// The name. /// The defaultvalue. /// The object. public DataMemberAccessor(MemberInfo memberInfo, string name, object defaultvalue, object obj) { Name = name; DefaultValue = defaultvalue; if (memberInfo.MemberType == MemberTypes.Field) { FieldInfo fieldInfo = (FieldInfo)memberInfo; Get = () => fieldInfo.GetValue(obj); Set = value => fieldInfo.SetValue(obj, value); } else if (memberInfo.MemberType == MemberTypes.Property) { PropertyInfo propertyInfo = (PropertyInfo)memberInfo; if (!propertyInfo.CanRead || !propertyInfo.CanWrite) { throw new PersistenceException( "Storable properties must implement both a Get and a Set Accessor. "); } Get = () => propertyInfo.GetValue(obj, null); Set = value => propertyInfo.SetValue(obj, value, null); } else { throw new PersistenceException( "The Storable attribute can only be applied to fields and properties."); } } /// /// Wrap existing getter and setter functions. /// /// The name. /// The default value. /// The getter. /// The setter. public DataMemberAccessor(string name, object defaultValue, Func getter, Action setter) { Name = name; DefaultValue = defaultValue; Get = getter; Set = setter; } /// /// Create an empty accessor that just encapsulates an object /// without access. /// /// The object public DataMemberAccessor(object o) { Name = null; DefaultValue = null; Get = () => o; Set = null; } /// /// Create an empty accessor that just encapsulates an object /// without access. /// /// The object /// The object's name. public DataMemberAccessor(object o, string name) { Name = name; DefaultValue = null; Get = () => o; Set = null; } /// /// Returns a that represents this instance. /// /// /// A that represents this instance. /// public override string ToString() { return String.Format("DataMemberAccessor({0}, {1}, {2}, {3})", Name, DefaultValue ?? "", Get.Method, Set.Method); } } }