using System;
using System.Dynamic;
using System.Reflection;
using System.Collections.Generic;
using static System.Console;
public class Dynamic : DynamicObject {
Dictionary<string, object> dictionary = new Dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result) => dictionary.TryGetValue(binder.Name, out result);
public override bool TrySetMember(SetMemberBinder binder, object value) {
dictionary[binder.Name] = value;
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) {
if (dictionary.ContainsKey(binder.Name)) {
((Action)dictionary[binder.Name]).Invoke(); //fiz gambi, precisa elaborar mais esta chamada para adequadar para qualquer tipo
result = "Método dinâmico executou";
return true;
}
try {
result = (typeof(Dictionary<string, object>)).InvokeMember(binder.Name, BindingFlags.InvokeMethod, null, dictionary, args);
} catch {
result = "Resultado falho";
WriteLine($"Executando método \"{binder.Name}\".");
}
return true;
}
public void Print() {
foreach (var pair in dictionary) {
if (!(pair.Value is Delegate)) WriteLine(pair.Key + " " + pair.Value);
}
if (dictionary.Count == 0) WriteLine("Sem membros para listar");
}
}
public class Program {
public static void Main(string[] args) {
dynamic din = new Dynamic(); //precisa ser dynamic para o compilador não reclamar dos membros dinâmicos
din.Nome = "Walla"; //criando membros dinamicamente
din.Sobrenome = "C#";
din.Action = new Action(() => WriteLine("Action Existe")); //isto não era necessário
din.Print(); //chama um método existente na classe
din.Action(); //chama o método que acabou de ser criado
din.Clear(); //chama um método disponível no dicionário interno, mas que não está definido na classe
din.Print(); //tá limpo
din.NaoExiste(); //este método não existe
dynamic
exp = new ExpandoObject
(); exp.
Action = new Action
(() => WriteLine
("Expando")); //só para mostrar que é possível fazer de forma automática, mas precisaria pesquisar }
}
//https://pt.stackoverflow.com/q/137542/101
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRHluYW1pYzsKdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwp1c2luZyBzdGF0aWMgU3lzdGVtLkNvbnNvbGU7CgpwdWJsaWMgY2xhc3MgRHluYW1pYyA6IER5bmFtaWNPYmplY3QgewogICAgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gZGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PigpOwoKICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFRyeUdldE1lbWJlcihHZXRNZW1iZXJCaW5kZXIgYmluZGVyLCBvdXQgb2JqZWN0IHJlc3VsdCkgPT4gZGljdGlvbmFyeS5UcnlHZXRWYWx1ZShiaW5kZXIuTmFtZSwgb3V0IHJlc3VsdCk7CgogICAgcHVibGljIG92ZXJyaWRlIGJvb2wgVHJ5U2V0TWVtYmVyKFNldE1lbWJlckJpbmRlciBiaW5kZXIsIG9iamVjdCB2YWx1ZSkgewogICAgICAgIGRpY3Rpb25hcnlbYmluZGVyLk5hbWVdID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHVibGljIG92ZXJyaWRlIGJvb2wgVHJ5SW52b2tlTWVtYmVyKEludm9rZU1lbWJlckJpbmRlciBiaW5kZXIsIG9iamVjdFtdIGFyZ3MsIG91dCBvYmplY3QgcmVzdWx0KSB7CgkJaWYgKGRpY3Rpb25hcnkuQ29udGFpbnNLZXkoYmluZGVyLk5hbWUpKSB7CgkJCSgoQWN0aW9uKWRpY3Rpb25hcnlbYmluZGVyLk5hbWVdKS5JbnZva2UoKTsgLy9maXogZ2FtYmksIHByZWNpc2EgZWxhYm9yYXIgbWFpcyBlc3RhIGNoYW1hZGEgcGFyYSBhZGVxdWFkYXIgcGFyYSBxdWFscXVlciB0aXBvCgkJCXJlc3VsdCA9ICJNw6l0b2RvIGRpbsOibWljbyBleGVjdXRvdSI7CgkJCXJldHVybiB0cnVlOwoJCX0KICAgICAgICB0cnkgewogICAgICAgICAgICByZXN1bHQgPSAodHlwZW9mKERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+KSkuSW52b2tlTWVtYmVyKGJpbmRlci5OYW1lLCBCaW5kaW5nRmxhZ3MuSW52b2tlTWV0aG9kLCBudWxsLCBkaWN0aW9uYXJ5LCBhcmdzKTsKICAgICAgICB9IGNhdGNoIHsKCQkJcmVzdWx0ID0gIlJlc3VsdGFkbyBmYWxobyI7CgkJCVdyaXRlTGluZSgkIkV4ZWN1dGFuZG8gbcOpdG9kbyBcIntiaW5kZXIuTmFtZX1cIi4iKTsKICAgICAgICB9CgkJcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHVibGljIHZvaWQgUHJpbnQoKSB7CgkJZm9yZWFjaCAodmFyIHBhaXIgaW4gZGljdGlvbmFyeSkgewoJCQlpZiAoIShwYWlyLlZhbHVlIGlzIERlbGVnYXRlKSkgV3JpdGVMaW5lKHBhaXIuS2V5ICsgIiAiICsgcGFpci5WYWx1ZSk7CgkJfQoJCWlmIChkaWN0aW9uYXJ5LkNvdW50ID09IDApIFdyaXRlTGluZSgiU2VtIG1lbWJyb3MgcGFyYSBsaXN0YXIiKTsKICAgIH0KfQoKcHVibGljIGNsYXNzIFByb2dyYW0gewogICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykgewogICAgICAgIGR5bmFtaWMgZGluID0gbmV3IER5bmFtaWMoKTsgLy9wcmVjaXNhIHNlciBkeW5hbWljIHBhcmEgbyBjb21waWxhZG9yIG7Do28gcmVjbGFtYXIgZG9zIG1lbWJyb3MgZGluw6JtaWNvcwogICAgICAgIGRpbi5Ob21lID0gIldhbGxhIjsgLy9jcmlhbmRvIG1lbWJyb3MgZGluYW1pY2FtZW50ZQogICAgICAgIGRpbi5Tb2JyZW5vbWUgPSAiQyMiOwoJCWRpbi5BY3Rpb24gPSBuZXcgQWN0aW9uKCgpID0+IFdyaXRlTGluZSgiQWN0aW9uIEV4aXN0ZSIpKTsgLy9pc3RvIG7Do28gZXJhIG5lY2Vzc8OhcmlvCiAgICAgICAgZGluLlByaW50KCk7IC8vY2hhbWEgdW0gbcOpdG9kbyBleGlzdGVudGUgbmEgY2xhc3NlCgkJZGluLkFjdGlvbigpOyAvL2NoYW1hIG8gbcOpdG9kbyBxdWUgYWNhYm91IGRlIHNlciBjcmlhZG8KICAgICAgICBkaW4uQ2xlYXIoKTsgLy9jaGFtYSB1bSBtw6l0b2RvIGRpc3BvbsOtdmVsIG5vIGRpY2lvbsOhcmlvIGludGVybm8sIG1hcyBxdWUgbsOjbyBlc3TDoSBkZWZpbmlkbyBuYSBjbGFzc2UKICAgICAgICBkaW4uUHJpbnQoKTsgLy90w6EgbGltcG8KICAgICAgICBkaW4uTmFvRXhpc3RlKCk7IC8vZXN0ZSBtw6l0b2RvIG7Do28gZXhpc3RlCgkJZHluYW1pYyBleHAgPSBuZXcgRXhwYW5kb09iamVjdCgpOwoJCWV4cC5BY3Rpb24gPSBuZXcgQWN0aW9uKCgpID0+IFdyaXRlTGluZSgiRXhwYW5kbyIpKTsgLy9zw7MgcGFyYSBtb3N0cmFyIHF1ZSDDqSBwb3Nzw612ZWwgZmF6ZXIgZGUgZm9ybWEgYXV0b23DoXRpY2EsIG1hcyBwcmVjaXNhcmlhIHBlc3F1aXNhcgoJCWV4cC5BY3Rpb24oKTsKICAgIH0KfQoKLy9odHRwczovL3B0LnN0YWNrb3ZlcmZsb3cuY29tL3EvMTM3NTQyLzEwMQ==