【发布时间】:2014-09-13 05:54:16
【问题描述】:
我有一个简单的 POCO 类,其中一个公共属性定义为动态。是否可以在运行时确定此属性的类型? 我试过使用这样的反射来获取类型:
myObject.GetType().GetProperties();
或者这个:
System.ComponentModel.TypeDescriptor.GetProperties(myObject);
但两者都返回 System.Object 而不是当前类型。 在 Visual Studio 调试器中,我看到列为“动态 {System.DateTime}”或“动态 {System.Int32}”的类型,这表明可以在运行时读取该类型。那么如何做到这一点呢?
编辑 - 添加显示问题的示例程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DynamicTypeSample
{
class Program
{
static void Main(string[] args)
{
DataTag datatag1 = new DataTag() { Id = Guid.NewGuid(), Name = "datatag1", Value = new DateTime(2014, 9, 12) };
DataTag datatag2 = new DataTag() { Id = Guid.NewGuid(), Name = "datatag2", Value = (int)1234 };
var propertyTypes1 = GetPropertyTypes(datatag1);
var propertyTypes2 = GetPropertyTypes(datatag2);
foreach (var p in propertyTypes1)
{
Console.WriteLine(p.Key + " " + p.Value.ToString());
}
foreach (var p in propertyTypes2)
{
Console.WriteLine(p.Key + " " + p.Value.ToString());
}
Console.ReadLine();
}
private static Dictionary<string, Type> GetPropertyTypes(DataTag datatag)
{
Dictionary<string, Type> results = new Dictionary<string, Type>();
foreach (var pi in (typeof(DataTag)).GetProperties())
{
results.Add(pi.Name, pi.PropertyType);
}
return results;
}
}
public class DataTag
{
public Guid Id { get; set; }
public string Name { get; set; }
public dynamic Value { get; set; }
}
}
输出如下:
标识系统.Guid
名称 System.String
值 System.Object
标识系统.Guid
名称 System.String
值 System.Object
我想要实现的是:
标识系统.Guid
名称 System.String
值 System.DateTime
标识系统.Guid
名称 System.String
值 System.Int32
【问题讨论】: