C# 4.0 如何在运行时确定动态属性的类型
我有一个简单的POCO类,其中一个公共属性定义为动态。是否可以在运行时确定此属性的类型? 我尝试过使用反射获取类型,如下所示:C# 4.0 如何在运行时确定动态属性的类型,c#-4.0,dynamic,C# 4.0,Dynamic,我有一个简单的POCO类,其中一个公共属性定义为动态。是否可以在运行时确定此属性的类型? 我尝试过使用反射获取类型,如下所示: myObject.GetType().GetProperties(); 或者这个: System.ComponentModel.TypeDescriptor.GetProperties(myObject); 但两者都返回System.Object,而不是当前类型。 在VisualStudio调试器中,我看到类型列表为“dynamic{System.DateTime}
myObject.GetType().GetProperties();
或者这个:
System.ComponentModel.TypeDescriptor.GetProperties(myObject);
但两者都返回System.Object,而不是当前类型。
在VisualStudio调试器中,我看到类型列表为“dynamic{System.DateTime}”或“dynamic{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; }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间DynamicTypeSample
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTag datatag1=newdatatag(){Id=Guid.NewGuid(),Name=“datatag1”,Value=newdatetime(2014,9,12)};
DataTag datatag2=newdatatag(){Id=Guid.NewGuid(),Name=“datatag2”,Value=(int)1234};
var propertyTypes1=GetPropertyTypes(datatag1);
var propertyTypes2=GetPropertyTypes(datatag2);
foreach(propertyTypes1中的var p)
{
Console.WriteLine(p.Key+“”+p.Value.ToString());
}
foreach(propertyTypes2中的var p)
{
Console.WriteLine(p.Key+“”+p.Value.ToString());
}
Console.ReadLine();
}
私有静态字典GetPropertyTypes(DataTag DataTag)
{
字典结果=新字典();
foreach(var pi in(typeof(DataTag)).GetProperties()
{
结果.添加(pi.Name,pi.PropertyType);
}
返回结果;
}
}
公共类数据标签
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共动态值{get;set;}
}
}
输出如下所示:Id系统Guid
名称系统.字符串
价值体系。对象
Id系统Guid
名称系统.字符串
价值体系。对象
我想要实现的是:
Id系统Guid
名称系统.字符串
Value System.DateTime
Id系统Guid
名称系统.字符串
Value System.Int32
如果我没弄错的话。你在那里做的是获取对象属性 您可以使用反射来迭代属性,以获取它们的基本信息和数据类型 也许你应该试试这样:
PropertyInfo[] propsobj = typeof(MyClassType).GetProperties();
foreach(PropertyInfo p in propsobj)
{
object[] attribs = p.MyProperty;
}
希望能有帮助。
干杯 抱歉,没有。此返回System.Object。我添加了一个完整的示例程序来演示。哦!我明白了,所以也许这篇文章可以帮助你:不,我不知道这有什么帮助。