C# 在运行时强制转换为自定义对象
今天,我有以下几种模型/课程:C# 在运行时强制转换为自定义对象,c#,asp.net-core,reflection,razor-pages,C#,Asp.net Core,Reflection,Razor Pages,今天,我有以下几种模型/课程: public class Event { public DateTime Date { get; set; } public string Name { get; set; } public string Description { get; set; } } public class Reportage { public string Author { get; set; } public string Name { g
public class Event
{
public DateTime Date { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class Reportage
{
public string Author { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
这些都是几个Razor页面的一部分,这些页面的代码或多或少都是100%相同的,但只有几行代码,这些代码在每个页面上都是唯一的,例如,与此不同:
List<Event> itemList = Utility.GetCachedData<List<Event>>("event.json");
下一步是做一些类似的事情,例如使用List itemList代码>,为此我找到了Convert.ChangeType(object,type)
,并执行了以下操作:
var pi = itemList[0].GetType().GetProperty("Date");
if (pi != null)
pi.SetValue(itemList[0], DateTime.Now, null);
var itemList = Convert.ChangeType(itemObj, typeof(List<Event>));
有没有办法在运行时解决这个问题(除了使用反射
),并使用标准的点表示法来获取/设置值
有没有办法在运行时解决这个问题(反射除外),并使用标准的点表示法来获取/设置值
不能使用点符号设置类型事件
的属性日期
,除非首先将变量强制转换为事件
:
var item = (Event)Convert.ChangeType(itemObj, typeof(Event));
item.Date = ...;
显然,这假设ChangeType
实际返回一个事件
有关更多信息,请参阅以下博客文章
为什么不使用反射,只编写itemList[0].Date=DateTime.Now
?您希望itemList.Date
做什么?您试图将属性分配给没有属性的对象。您的Convert
毕竟是在创建列表
而不是事件
。这个例子让我很困惑:/@MarkusDeibel对不起,打错了那一行…更新了问题。我可能遗漏了什么,但是你不能为事件
类的Date
属性设置一个默认值吗<代码>公共日期时间日期{get;set;}=DateTime.Now代码>我不认为使用反射更易于维护。一般来说,这似乎是一个XY问题。询问你实际上试图解决的问题,而不是你认为能解决问题的解决方案。传递给这些视图的模型之间有什么不同,您无法概括Razor代码?我怀疑这一点…感谢您的确认,感谢您的链接,对我很有用。
var item = (Event)Convert.ChangeType(itemObj, typeof(Event));
item.Date = ...;