Creación de una clase que implementa DynamicObject¿Se puede obtener el valor encadenado de DynamicObject?
public class Test : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (binder.Name == ("Posts"))
{
result = "property accessed was 'Posts'";
return true;
}
return base.TryGetMember(binder, out result);
}
}
puedo llamar
dynamic test = new Test();
var result = test.Posts;
Y el valor de result
es "dinámico prueba nueva = Test(); var result = test.Posts;"
Eso está bien.
Lo que me pregunto es, cuando se invoca TryGetMember es posible obtener el valor encadenado.
Así que si me llama:
dynamic test = new Test();
var result = test.Posts.Load(123);
que puede luego hacer algo como:
if (binder.Name == ("Posts"))
{
if (... == "Load")
result = this.Load<Post>(... 123);
return true;
}
es algo así como que sea posible? No puedo encontrar una manera de hacerlo.
hasta ahora tengo:
class Program
{
static void Main(string[] args)
{
dynamic test = new Test();
dynamic result = test.Posts.Load(123);
Console.WriteLine(result.Name);
dynamic result2 = test.Posts.Load(909);
Console.WriteLine(result2.Name);
Console.ReadKey();
}
}
public class Test : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (binder.Name == ("Posts"))
{
result = new ChainBuilder(this, "Post");
return true;
}
return base.TryGetMember(binder, out result);
}
public T Load<T>(int id) where T : Post, new()
{
if (id == 123)
return new T {Id = 123, Name = "Bananas"};
return new T {Id = 0, Name = "Others"};
}
private class ChainBuilder : DynamicObject
{
public dynamic OriginalObject { get; set; }
public string PropertyInvoked { get; set; }
public ChainBuilder(DynamicObject originalObject, string propertyInvoked)
{
OriginalObject = originalObject;
PropertyInvoked = propertyInvoked;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
if (binder.Name == "Load")
{
result = OriginalObject.Load<Post>((int)args[0]);
return true;
}
return base.TryInvokeMember(binder, args, out result);
}
}
}
public class Post
{
public int Id { get; set; }
public string Name { get; set; }
}
Cuál es gracias a Bartosz.
Pero parece que es básicamente lo que Marc ha suministrado.
¡Déme un buen punto de partida! Dejaré esto abierto por ahora para cualquier otra sugerencia.
Esta cuestión ha dado lugar a
Noun proyecto real, sólo la creación de prototipos, pero logrado lo que queríamos.
Impresionante, estaba editando mi publicación mientras usted publicaba la suya. ¡Gracias! – Phill