Это не относится к вашему сценарию точно, но как насчет использования реализации DynamicObject, которая действует как декоратор вокруг вашего объекта?Это позволит вам получить доступ к исходному объекту, а также к дополнительным свойствам.Вроде как ExpandoObject, но начиная с ваших собственных данных экземпляра.
Примерно так:
public class Expando : DynamicObject
{
public dynamic Instance;
Dictionary<string, dynamic> ExtraProperties = new Dictionary<string, dynamic>();
public Expando(object instance)
{
Instance = instance;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
try
{
result = ReflectionUtils.GetProperty(Instance, binder.Name);
return true;
}
catch
{
if (ExtraProperties.Keys.Contains(binder.Name))
{
result = ExtraProperties[binder.Name];
return true;
}
}
result = null;
return false;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
try
{
ReflectionUtils.SetProperty(Instance, binder.Name, value);
}
catch (Exception ex)
{
ExtraProperties[binder.Name] = value;
}
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
try
{
result = ReflectionUtils.CallMethod(Instance, binder.Name, args);
return true;
}
catch
{}
result = null;
return false;
}
}
К сожалению, оно не отвечает вашим строгим требованиям к типизации / интерфейсу, и производительность не будет самой высокой, учитывая использование Reflection здесь (с *)1006 *http://www.west -wind.com: 8080 / SVN / WestwindWebToolkit / багажник / Westwind.Utilities / Утилиты / ReflectionUtils.cs )