diff options
Diffstat (limited to 'csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs')
-rw-r--r-- | csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs b/csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs new file mode 100644 index 00000000..51b94931 --- /dev/null +++ b/csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using Google.Protobuf; +using Google.Protobuf.FieldAccess; + +namespace Google.Protobuf.FieldAccess +{ + /// <summary> + /// Base class for field accessors. + /// </summary> + /// <typeparam name="T">Type of message containing the field</typeparam> + internal abstract class FieldAccessorBase<T> : IFieldAccessor<T> where T : IMessage<T> + { + private readonly Func<T, object> getValueDelegate; + + internal FieldAccessorBase(string name) + { + PropertyInfo property = typeof(T).GetProperty(name); + if (property == null || !property.CanRead) + { + throw new ArgumentException("Not all required properties/methods available"); + } + getValueDelegate = ReflectionUtil.CreateUpcastDelegate<T>(property.GetGetMethod()); + } + + public object GetValue(T message) + { + return getValueDelegate(message); + } + + public abstract bool HasValue(T message); + public abstract void Clear(T message); + public abstract void SetValue(T message, object value); + } +} |