【发布时间】:2013-06-01 16:50:09
【问题描述】:
这是我的情况: 我有代表属性的类:
public abstract class RootProperty {
public int Id {get; set;}
}
public class AProperty {}
public class BProperty {}
让这些都是战利品:
public class ZProperty {}
以及每个属性的值,
public abstract class RootValue {
public RootProperty Property {get;set;}
}
public class AValue : RootValue {
public AValue(AProperty) { ... }
public string Value {get; set;}
}
public class ZValue : RootValue {
public ZValue(ZProperty) { ... }
public sometipe Value {get;set;} }
实际上,每个类都代表一种属性,而不是事物必须具有的属性。因此,如果我想说一个属性是由一个字符串定义的,该字符串在给定域中必须具有值,我会说:
public class DomainProperty {
public ICollection<string> Domain {get; set;}
}
public class DomainValue {
public DomainValue(DomainProperty) {...}
public string Value
{
set {
if (!this.Property.Domain.Any(d=>d==value)) {
throw new Exceptin("Value out of range!");
}
}
}
}
所以我可以让狗可大可小,我的狗可大。
DomainProperty DogsSize = new DomainProperty { Domain= ["big","small"] }
DomainValue MyDogSize = new DomainValue(color) { Value = "big" }
使用它,我可以定义具有最大值和最小值等数值范围的属性。好吧,这里的第一个问题是:对于这个可定制类型的属性问题,你能想出其他解决方案吗?
现在,让我在这里发帖的问题: 前面的逻辑在服务器端,它从客户端接收一个抽象 dto 列表:
public abstract class RootDto { public int PropertyId { get; set; } }
public class ADto : RootDto { public string Value { get; set; } }
public class BDto: RootDto { public bool Value { get; set; } }
public class ZDto : RootDto { public someothertype Value { get; set; } }
使用 RootDto PropertyId 我可以找到原始的 RootProperty。我想创建一个?Value 的新实例,并将该值设置为?Dto.Value。 现在我在很多演员表上都有这个:
List<RootDto> listDto;
foreach(dto in listDtio) {
if (someDto is ADto) {
ADto castedDto = (ADto) dto;
AProperty dtoProperty = (AProperty) Repository.findRootProperty(dto.PropertyId);
AValue valueForDto = new AValue(dtoProperty);
valueForDto.Value = castedDto.Value;
}
if ...(B.....Z)
}
这行得通,但是如果你有 15 个可能的属性类的话,会产生大量重复代码。 我调查了反射和动态类型,但一无所获,你能帮帮我吗? 感谢您的宝贵时间,希望我给了一个很好的解释。
【问题讨论】:
标签: c#-4.0 generics dynamic reflection