[英]Use 'dynamic' throw a RuntimeBinderException
public class Peploe
{
public string Name { get; set; }
}
public class Animal
{
public string NickName { get; set; }
}
internal static class Program
{
/// <summary>
/// This 'ItemSorce' will be assignment by anywhere , so i don't know it have 'Name' property.
/// </summary>
public static IEnumerable ItemSource { get; set; }
private static void Main()
{
var list = new List<Peploe>() {new Peploe() {Name = "Pato"}};
ItemSource = list;
//Test2
//var animals = new List<Animal>() { new Animal() { NickName = "Pi" } };
//ItemSource = animals;
dynamic dy;
foreach (var item in ItemSource)
{
dy = item;
Console.WriteLine(dy.Name);//If I Uncomment 'Test2',it will throw a RuntimeBinderException at here.
}
}
}
如果我使用反射,它可以解決此問題。 但是,當“ ItemSource”非常大時,“ foreach”將執行很多次,性能很差。如何解決此問題。
您需要添加一點反射以使它完全動態。 相信我,這不會損害性能,因為我已經在使用它。 這是我從您創建的代碼示例。 它仍然還沒有准備好生產,但是您會在不受所有限制的情況下獲得基本的想法。
dynamic dy;
List<dynamic> result = new List<dynamic>();
foreach (var item in ItemSource)
{
dy = new ExpandoObject();
var d = dy as IDictionary<string, object>;
foreach (var property in item.GetType().GetProperties())
{
d.Add(property.Name, item.GetType().GetProperty(property.Name).GetValue(item, null));
}
result.Add(dy);
}
foreach (var item in result)
{
var r = ((dynamic)item) as IDictionary<string, object>;
foreach (var k in r.Keys)
{
Console.WriteLine(r[k] as string);
}
}
該代碼完全按照您想要的方式工作。 它不取決於您在課堂上擁有的任何財產。 請讓我知道是否需要更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.