使用通用接口获取公共属性
本文关键字:属性 接口 获取 | 更新日期: 2023-09-27 18:04:42
对不起,我真的无法用语言解释我要做什么,但是。。
说我有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"列表,并填充任何具有ValueClass
Property
的派生类型。
目前,我认为Reflection
是我唯一真正的选择。
这些类关系一团糟,我保证您不会对这些继承和参数关系感到满意。你能详细说明你想做什么吗?
无论如何,您可以通过以下方式访问属性和Id:
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 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.将接口附加到应实现它的类型。
您可以尝试:
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);
}
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);
}