本文介绍了使用反射将属性动态转换为其实际类型(实际类型为通用类型)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
此处.我根据需要修改了相同的代码,如下所示:
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.
这篇关于使用反射将属性动态转换为其实际类型(实际类型为通用类型)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!