我需要将属性动态地转换为其实际类型。我/我如何使用反射来做到这一点?
为了解释我正在研究的真实场景。我试图在 Entity Framework 属性上调用“第一”扩展方法。将在Framework上下文对象上调用的特定属性作为字符串传递给方法(以及要检索的记录的ID)。因此,我需要对象的实际类型才能调用First方法。
我不能在对象上使用“Where”方法,因为lambda或委托(delegate)方法仍然需要对象的实际类型才能访问属性。
同样,由于对象是由 Entity Framework 生成的,因此我无法将类型转换为接口(interface)并对其进行操作。
这是方案代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Reflection;
namespace NmSpc
{
public class ClassA
{
public int IntProperty { get; set; }
}
public class ClassB
{
public ClassA MyProperty { get; set; }
}
public class ClassC
{
static void Main(string[] args)
{
ClassB tester = new ClassB();
PropertyInfo propInfo = typeof(ClassB).GetProperty("MyProperty");
//get a type unsafe reference to ClassB`s property
Object property = propInfo.GetValue(tester, null);
//get the type safe reference to the property
ClassA typeSafeProperty = property as ClassA;
//I need to cast the property to its actual type dynamically. How do I/Can I do this using reflection?
//I will not know that "property" is of ClassA apart from at runtime
}
}
}
最佳答案
public object CastPropertyValue(PropertyInfo property, string value) {
if (property == null || String.IsNullOrEmpty(value))
return null;
if (property.PropertyType.IsEnum)
{
Type enumType = property.PropertyType;
if (Enum.IsDefined(enumType, value))
return Enum.Parse(enumType, value);
}
if (property.PropertyType == typeof(bool))
return value == "1" || value == "true" || value == "on" || value == "checked";
else if (property.PropertyType == typeof(Uri))
return new Uri(Convert.ToString(value));
else
return Convert.ChangeType(value, property.PropertyType); }
关于c# - 使用反射将属性动态转换为其实际类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/907882/