使用反射将属性动态转换为其实际类型(实际类型为通用类型) [英] Cast a property to its actual type dynamically using reflection (where actual type is generic)

查看:49
本文介绍了使用反射将属性动态转换为其实际类型(实际类型为通用类型)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此处.我根据需要修改了相同的代码,如下所示:

This is a slightly different question asked here. I modified the same code into my needs like below:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace cns01
{
    class Program
    {
        public class ClassA<T>
        {
            public int IntProperty { get; set; } = 999;
        }

        public class ClassB<T2>
        {
            public ClassA<int> MyIntProperty { get; set; }
            public ClassA<string> MyStringProperty { get; set; }
        }

        static void Main(string[] args)
        {
            ClassB<int> tester = new ClassB<int>();
            tester.MyIntProperty = new ClassA<int>() { IntProperty = 777 };

            PropertyInfo propInfo = typeof(ClassB<>).GetProperty("MyIntProperty");

            dynamic property = propInfo.GetValue(tester, null); // <-- Here I get error : Late bound operations cannot be performed on fields with types for which Type.ContainsGenericParameters is true

            int result = property.IntProperty; //(*1)
        }
    }
}

有人知道如何将值设置(和/或获取)到result(* 1)吗?

anyone got an idea how to set (and/or get) value into result(*1)?

感谢您的帮助,事先谢谢...

I appreciate any help, Thx beforehand...

我的实际位置是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace cns01
{
    class Program
    {
        public class DataFieldInfo2<T>
        {
            public bool IsSearchValue { get; set; } = false;
            public T Value { get; set; }
        }

        public class SmartRowVertrag
        {
            public DataFieldInfo2<int> ID { get; set; }
            public DataFieldInfo2<string> VSNR { get; set; }
        }

        static void Main(string[] args)
        {
            SmartRowVertrag tester = new SmartRowVertrag();
            tester.ID = new DataFieldInfo2<int>() { Value = 777, IsSearchValue = false };
            tester.VSNR = new DataFieldInfo2<string>() { Value = "234234234", IsSearchValue = true };

            var g = RetData3(tester);
        }

        public static object RetData3(object fsr)
        {
            object retVal = new object();
            var props = fsr.GetType().GetProperties();
            foreach (var prop in props)
            {
                PropertyInfo propInfo = prop.GetType().GetProperty("IsSearchValue"); // <-- here I get null
                propInfo = prop.PropertyType.GetProperty("IsSearchValue"); // here I get a propertyInfo, but...
                dynamic property = propInfo.GetValue(fsr, null); // ...<-- here fires error
                var result = property.IsSearchValue;
                if (result == true)
                {
                    // doThis
                }
            }
            return retVal;
        }
    }
}

我该如何完成此操作而不会出现任何错误?道具"似乎是PropertyInfo,我不能将其用作通用DataFieldInfo2.

how can I accomplish this without any error? "prop" seems to be a PropertyInfo which I cant use as a generic DataFieldInfo2.

推荐答案

更改代码以将属性接收到:

Change your code to receive property to:

PropertyInfo propInfo = tester.GetType().GetProperty("MyIntProperty");

因此,您使用构造的泛型类型.

So you use constructed generic type.

这篇关于使用反射将属性动态转换为其实际类型(实际类型为通用类型)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆