使用反射将属性动态转换为实际类型实际类型为通用类型

问题描述

这是一个here稍有不同的问题。 我根据需要修改了相同的代码,如下所示:

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)吗?

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

我的实际位置是:

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;
        }
    }
}

我该如何完成此操作而不会出现任何错误? “ prop”似乎是PropertyInfo,我不能将其用作通用datafieldInfo2。

解决方法

更改您的代码以接收以下内容的财产:

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

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