获取所有后代类型的基类

时间:2012-04-14 05:26:59

标签: asp.net devexpress xaf

我有一个名为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列表视图中。

我想要执行以下操作:当用户单击Edit按钮,然后在列表视图查找字段中显示所有后代类型。当用户将记录更改ObjectType保存到选定值时。

我该怎么做?
感谢。

PS。这是asp.net app。

1 个答案:

答案 0 :(得分:5)

我不确定你的方法对于你想要实现的目标是否正确。首先,我将回答你提出的问题,然后我将尝试解释XAF如何提供你想要实现的功能,即如何从用户界面中选择要创建的记录子类。

为了创建允许用户在应用程序中选择Type的属性,您可以声明TypeConverter:

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);
    }
}

然后您的基本事件类看起来像:

public class BaseEvent: XPObject
{
    public BaseEvent(Session session)
        : base(session)
    { }

    private Type _EventType;
    [TypeConverter(typeof(EventClassInfoTypeConverter))]
    public Type EventType
    {
        get
        {
            return _EventType;
        }
        set
        {
            SetPropertyValue("EventType", ref _EventType, value);
        }
    }
}

但是,我怀疑这不是您需要的功能。修改属性的值不会更改记录的基本类型。也就是说,您最终会得到BaseEvent类型的记录,其属性Type等于'Concert'或'Film'。

XAF已经提供了一种机制来选择要创建的记录类型。在您的场景中,您会发现 New 按钮是一个下拉列表,其中包含不同的子类作为选项:

enter image description here

因此,您无需在对象中创建“type”属性。如果需要列在列表视图中显示事件类型,则可以按如下方式声明属性

[PersistentAlias("XPObjectType.Name")]
public string EventType
{
    get
    {
        return base.ClassInfo.ClassType.Name;
    }
}