एक वर्ग है कि 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);
}
}
लागू करता बनाना मैं कॉल कर सकते हैं
dynamic test = new Test();
var result = test.Posts;
और result
का मूल्य है "गतिशील परीक्षण = नए टेस्ट(); वर परिणाम = test.Posts,"
यह ठीक है।
मैं क्या सोच रहा हूं, जब TryGetMember का आह्वान किया जाता है तो यह जंजीर मूल्य प्राप्त करना संभव है।
तो अगर मैं कहा जाता है:
if (binder.Name == ("Posts"))
{
if (... == "Load")
result = this.Load<Post>(... 123);
return true;
}
कि संभव तरह कुछ है:
dynamic test = new Test();
var result = test.Posts.Load(123);
मैं तो जैसे कुछ कर सकते हैं? मैं इसे करने का कोई तरीका नहीं समझ सकता।
अब तक मेरे पास है:
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; }
}
कौन सा बार्तोज़ करने के लिए धन्यवाद है।
लेकिन ऐसा लगता है कि यह मूल रूप से मार्क ने क्या प्रदान किया है।
मुझे एक अच्छा प्रारंभिक बिंदु दें! मैं इसे किसी अन्य सुझाव के लिए अभी खोल दूंगा।
यह सवाल
नहीं एक वास्तविक परियोजना में बदल गया है, बस प्रोटोटाइप लेकिन हासिल की है कि हम क्या चाहते थे।
बहुत बढ़िया, मैं बस अपना पोस्ट को संपादित करने गया था, जबकि तुम अपने पोस्ट की। धन्यवाद! – Phill