简体   繁体   中英

Cast a property to its actual type dynamically using reflection (where actual type is generic)

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

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

I appreciate any help, Thx beforehand...

My actual position is:

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM