Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如何在运行时确定动态属性的类型_C# 4.0_Dynamic - Fatal编程技术网

C# 4.0 如何在运行时确定动态属性的类型

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}

我有一个简单的POCO类,其中一个公共属性定义为动态。是否可以在运行时确定此属性的类型? 我尝试过使用反射获取类型,如下所示:

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。我添加了一个完整的示例程序来演示。哦!我明白了,所以也许这篇文章可以帮助你:不,我不知道这有什么帮助。