aboutsummaryrefslogtreecommitdiff
path: root/csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs
diff options
context:
space:
mode:
Diffstat (limited to 'csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs')
-rw-r--r--csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs38
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);
+ }
+}