0

抱歉,我无法用语言真正解释我想要做什么,但是..

说我有 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
{
}

我需要从一个包含和(以及更多)Property的列表中获取一个值,但我不知道如何遍历列表并设置值。List<TestClass>TestClass1TestClass2Property

所以这基本上就是我想要做的

List<TestClass> list = new List<TestClass>();

foreach (var item in list.OfType<????>())
{
    item.Property = PropertyManager.GetProperty(item.Property.Id);
}

编辑:

我有许多具有共同属性的类,但我需要该Type属性的实际值而不是base Type(由于序列化等其他因素),并且我需要能够遍历主基类的列表并访问该属性.

就像我上面的例子一样,我只需Id要从Property.

目前每个班级都有自己的班级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只是Dictionary一种ValueClass类型

public static ValueClass GetProperty(int id)
{
    if (_properties.Containskey(id))
    {
       return _properties[id];
    }
    return null;
}

所以我需要的是一种循环“TestClass”列表并填充任何具有ValueClass Property.

目前我认为Reflection这是我唯一真正的选择。

4

3 回答 3

2

这些类关系是一团糟,我保证你不会对这些继承和参数关系感到满意。你能详细说明你想要做什么吗?

无论如何,您可以通过以下方式访问PropertyId

 static void Main(string[] args)
    {
        List<TestClass> list = new List<TestClass>();

        foreach (TestClass item in list)
        {
            ValueClass x = item.Property;
            int y = item.Property.Id;
        }
    }

在这种情况下,通常最好首先避免使用 var,以了解变量的类型。

编辑
一个快速且不太脏的解决方案是使用dynamic

dynamic d = o; // assign the items in your list to a dynamic variable
var somevar = d.Property;    // access any property you expect x to have.

编辑 干净的解决方案是:
1. 定义一个接口,在循环中包含您想要和需要的所有内容。
2. 将接口附加到实现它的类型上。

于 2013-03-19T08:46:42.430 回答
0
public interface IHasProperty {
   ValueClass PropertyAsValueClass { get;set; }
}

public class TestClass<T> : IHasProperty where T : ValueClass
{
   public T Property {get;set;}

   public ValueClass PropertyAsValueClass {
     get { return this.Property; }
     set { this.Property = value as T; }
   }
}

public class TestClass1 : TestClass<ValueClass>
{
}

public class TestClass2 : TestClass<ValueClass2>
{
}

public class ValueClass
{
    public int Id { get; set; }
}

public class ValueClass2 : ValueClass
{
}

如果你愿意,你可以额外检查...

接着

var list = new List<IHasProperty>();
foreach (var item in list)
{
    item.PropertyAsValueClass = PropertyManager.GetProperty(item.PropertyAsValueClass.Id);
}
于 2013-03-19T11:31:44.657 回答
0

你可以试试:

public class TestClass
{
    public virtual ValueClass Property { get; set; }
}

public class TestClass1 : TestClass
{
    private ValueClass property = null;
    public override ValueClass Property
    {
        get
        {
            return property;
        }
        set
        {
            property = (ValueClass)value;
        }
    }
}

public class TestClass2 : TestClass
{
    private ValueClass2 property = null;
    public override ValueClass Property
    {
        get
        {
            return property;
        }
        set
        {
            property = (ValueClass2)value;
        }
    }
}

public class ValueClass
{
    public int Id { get; set; }
}

public class ValueClass2 : ValueClass
{
}

和:

foreach (var item in list)
        {
            item.Property = PropertyManager.GetProperty(item);
        }
于 2013-03-19T11:03:31.890 回答