我在使用 C# 进行转换时遇到问题
首先,我的辅助功能,以便更好地理解
public static class Extensions {
public static IEnumerable<T> ToEnumerable<T>(this T value) {
yield return value;
}
public static dynamic ToDynamic(this object value) {
IDictionary<string, object> e = new ExpandoObject();
foreach (PropertyDescriptor item in TypeDescriptor.GetProperties(value.GetType())) { e.Add(item.Name, item.GetValue(value));
return e;
}
public static IEnumerable<T> ToCast<T>(this IEnumerable<object> value, T sample) where T: class {
return null; /* HELP */
}
public static T ToCastFirstorDefault<T>(this object value, T sample) where T: class {
return value.ToEnumerable().ToCast(sample).Take(1).FirstOrDefault();
}
}
在控制器端有一个对象数据,如示例所示
object Model = new { take = 10, data = new object[] { new { tarih = DateTime.MaxValue, proje = "Lorem Ipsum", durum = true } } };
我可以通过使用 ToDynamic、ToEnumerable 函数在 .cshtml 页面端使用它
var dy = Model.ToEnumerable().Select(x => x.ToDynamic()).Select(x => new
{
take = (int)x.take,
data = ((object[])x.data).Select(y => y.ToDynamic()).Select(y => new
{
tarih = (DateTime)y.tarih,
proje = (string)y.proje,
durum = (bool)y.durum
})
}).Take(1).FirstOrDefault();
虽然这个构建 100% 正确,但是当有更多属性时根本不友好
我想要这样我就可以使用 ToCast、ToCastFirstorDefault 函数,正如我在下面的示例中所写的那样。 可能吗?
var rslt = Model.ToCastFirstorDefault(new {
take = 0,
data = default(object[])
});
或:
var rslt = Model.ToCastFirstorDefault(new {
take = 0,
data = default(object[])
}).ToEnumerable().Select(x=> new {
x.take,
data = x.data.ToCast(new { tarih = default(DateTime), proje = "", durum = false })
}).Take(1).FirstOrDefault();
由于匿名类型,我无法使用 Convert.ChangeType。