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实例(我从远程系统获取信息),并且我不知道应该是什么类型,因此,用户必须手动选择它。谢谢你的回答。