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.cs23
1 files changed, 13 insertions, 10 deletions
diff --git a/csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs b/csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs
index 73d777b2..2a3e5b8b 100644
--- a/csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs
+++ b/csharp/src/ProtocolBuffers/FieldAccess/FieldAccessorBase.cs
@@ -32,34 +32,37 @@
using System;
using System.Reflection;
+using Google.Protobuf.Descriptors;
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>
+ internal abstract class FieldAccessorBase : IFieldAccessor
{
- private readonly Func<T, object> getValueDelegate;
+ private readonly Func<object, object> getValueDelegate;
+ private readonly FieldDescriptor descriptor;
- internal FieldAccessorBase(string name)
+ internal FieldAccessorBase(Type type, string propertyName, FieldDescriptor descriptor)
{
- PropertyInfo property = typeof(T).GetProperty(name);
+ PropertyInfo property = type.GetProperty(propertyName);
if (property == null || !property.CanRead)
{
throw new ArgumentException("Not all required properties/methods available");
}
- getValueDelegate = ReflectionUtil.CreateUpcastDelegate<T>(property.GetGetMethod());
+ this.descriptor = descriptor;
+ getValueDelegate = ReflectionUtil.CreateFuncObjectObject(property.GetGetMethod());
}
- public object GetValue(T message)
+ public FieldDescriptor Descriptor { get { return descriptor; } }
+
+ public object GetValue(object message)
{
return getValueDelegate(message);
}
- public abstract bool HasValue(T message);
- public abstract void Clear(T message);
- public abstract void SetValue(T message, object value);
+ public abstract void Clear(object message);
+ public abstract void SetValue(object message, object value);
}
}