【发布时间】:2013-03-19 08:38:38
【问题描述】:
对不起,我无法用语言真正解释我想要做什么,但是..
假设我有 secnario。
public class TestClass
{
}
public class TestClass1 : TestClass, TestInterface<ValueClass1>
{
public ValueClass1 Property { get; set; }
}
public class TestClass2 : TestClass, TestInterface<ValueClass2>
{
public ValueClass2 Property { get; set; }
}
public interface TestInterface<T> where T : ValueClass
{
T Property { get; set; }
}
public class ValueClass
{
public int Id { get; set; }
}
public class ValueClass2 : ValueClass
{
}
我需要从包含TestClass1 和TestClass2(以及更多)的List<TestClass> 列表中从Property 获取一个值,但我不知道如何遍历列表并设置Property 值。
所以这基本上就是我想要做的事情
List<TestClass> list = new List<TestClass>();
foreach (var item in list.OfType<????>())
{
item.Property = PropertyManager.GetProperty(item.Property.Id);
}
编辑:
我有许多具有共同属性的类,但我需要该属性的实际 Type 而不是 base Type(由于序列化等其他因素),并且我需要能够遍历列表主基类并访问该属性。
就像我上面的例子一样,我只需要从Property 中获取Id 值。
目前每个班级都有自己的Property,我正在使用Reflection 来做我需要的事情,我只是在寻找更清洁的解决方案。
编辑:
这是我当前的实现
public class TestClass
{
}
public class TestClass1 : TestClass
{
public ValueClass Property { get; set; }
}
public class TestClass2 : TestClass
{
public ValueClass2 Property { get; set; }
}
public class ValueClass
{
public int Id { get; set; }
}
public class ValueClass2 : ValueClass
{
}
并设置我必须使用反射的值
List<TestClass> list = new List<TestClass>();
foreach (var item in list.Where(x => x.GetType().GetProperty("Property") != null))
{
var property = item.GetType().GetProperty("Property");
property.SetValue(PropertyManager.GetProperty((property.GetValue(item) as ValueClass).Id));
}
而PropertyManager 只是ValueClass 类型中的Dictionary
public static ValueClass GetProperty(int id)
{
if (_properties.Containskey(id))
{
return _properties[id];
}
return null;
}
所以我需要一种方法来循环“TestClass”列表并填充具有ValueClassProperty 的任何派生类型。
目前我认为Reflection 是我唯一真正的选择。
【问题讨论】:
-
为什么你需要
OfType列表已经是TestClass 类型,它暴露了Property? -
@BobVale,抱歉,查看我的编辑,我错过了示例中的基类。
-
在您的示例中,如果您尝试在
TypeClass2类型的实例上将ValueClass类型的值设置为Property属性,您期望会发生什么。这将在运行时失败。
标签: c# generics interface casting