Asp.net 获取基类的所有子类类型
我有一个名为Asp.net 获取基类的所有子类类型,asp.net,devexpress,xaf,Asp.net,Devexpress,Xaf,我有一个名为BaseEvent的基类和几个子类: public class BaseEvent { // the some properties // ... } [MapInheritance(MapInheritanceType.ParentTable)] public class Film : BaseEvent { // the some properties // ... } [MapInheritance(MapInheritanceType.Paren
BaseEvent
的基类和几个子类:
public class BaseEvent {
// the some properties
// ...
}
[MapInheritance(MapInheritanceType.ParentTable)]
public class Film : BaseEvent {
// the some properties
// ...
}
[MapInheritance(MapInheritanceType.ParentTable)]
public class Concert : BaseEvent {
// the some properties
// ...
}
我有一个在运行时创建BaseEvent
实例的代码:
BaseEvent event = new BaseEvent();
// assign values for a properties
// ...
baseEvent.XPObjectType = Database.XPObjectTypes.SingleOrDefault(
t => t.TypeName == "MyApp.Module.BO.Events.BaseEvent");
现在,此事件将显示在BaseEvent
列表视图中
我要执行以下操作:当用户单击“编辑”按钮时,在列表视图中显示所有子体类型的查找字段。当用户保存记录时,将对象类型更改为所选值
我该怎么做?谢谢
注:这是asp.net应用程序。我不确定您的方法是否适合您试图实现的目标。首先,我将回答您提出的问题,然后我将尝试解释XAF如何提供您试图实现的功能,即如何从用户界面选择要创建的记录子类 为了创建允许用户在应用程序中选择类型的属性,您可以声明类型转换器:
public class EventClassInfoTypeConverter : LocalizedClassInfoTypeConverter
{
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
List<Type> values = new List<Type>();
foreach (ITypeInfo info in XafTypesInfo.Instance.PersistentTypes)
{
if ((info.IsVisible && info.IsPersistent) && (info.Type != null))
{
// select BaseEvent subclasses
if (info.Type.IsSubclassOf(typeof(BaseEvent)))
values.Add(info.Type);
}
}
values.Sort(this);
values.Insert(0, null);
return new TypeConverter.StandardValuesCollection(values);
}
}
但是,我怀疑这不是您需要的功能。修改属性的值不会更改记录的基本类型。也就是说,您将得到一个类型为BaseEvent
的记录,其属性type
等于“Concert”或“Film”
XAF已经提供了一种选择要创建的记录类型的机制。在您的场景中,您会发现新按钮是一个下拉列表,其中包含不同的子类作为选项:
因此,您不需要在对象中创建“type”属性。如果需要列来显示列表视图中的事件类型,可以按如下方式声明属性
[PersistentAlias("XPObjectType.Name")]
public string EventType
{
get
{
return base.ClassInfo.ClassType.Name;
}
}
我不确定你的方法是否适合你想要实现的目标。首先,我将回答您提出的问题,然后我将尝试解释XAF如何提供您试图实现的功能,即如何从用户界面选择要创建的记录子类 为了创建允许用户在应用程序中选择类型的属性,您可以声明类型转换器:
public class EventClassInfoTypeConverter : LocalizedClassInfoTypeConverter
{
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
List<Type> values = new List<Type>();
foreach (ITypeInfo info in XafTypesInfo.Instance.PersistentTypes)
{
if ((info.IsVisible && info.IsPersistent) && (info.Type != null))
{
// select BaseEvent subclasses
if (info.Type.IsSubclassOf(typeof(BaseEvent)))
values.Add(info.Type);
}
}
values.Sort(this);
values.Insert(0, null);
return new TypeConverter.StandardValuesCollection(values);
}
}
但是,我怀疑这不是您需要的功能。修改属性的值不会更改记录的基本类型。也就是说,您将得到一个类型为BaseEvent
的记录,其属性type
等于“Concert”或“Film”
XAF已经提供了一种选择要创建的记录类型的机制。在您的场景中,您会发现新按钮是一个下拉列表,其中包含不同的子类作为选项:
因此,您不需要在对象中创建“type”属性。如果需要列来显示列表视图中的事件类型,可以按如下方式声明属性
[PersistentAlias("XPObjectType.Name")]
public string EventType
{
get
{
return base.ClassInfo.ClassType.Name;
}
}
你有什么问题?使用子类型创建列表、从列表中获取所选项目或更新ObjectType属性?@Leonid:如果提供的解决方案不满足您的需要,请随时在DevXPress支持中心票证()中重新激活您的票证。我们很乐意帮助您。您有什么问题?使用子类型创建列表、从列表中获取所选项目或更新ObjectType属性?@Leonid:如果提供的解决方案不满足您的需要,请随时在DevXPress支持中心票证()中重新激活您的票证。我们很乐意帮助您。我需要这个,因为我在运行时创建了BaseEvent实例(我从远程系统获取信息),并且我不知道应该是什么类型,因此,用户必须手动选择它。感谢您的回答。我需要这个,因为我在运行时创建了BaseEvent实例(我从远程系统获取信息),并且我不知道应该是什么类型,因此,用户必须手动选择它。谢谢你的回答。