如何获取类的鉴别器?

凯尔·里尔伯(Kjell Rilbe)

在MDriven中,我想在运行时获取建模类的类型鉴别符。我以为我以前做过,但似乎找不到并无法解决。

我的意思是首先在外部ID字符串中出现的整数,例如外部ID“ 72!i64!12345678”中的“ 72”。

我需要基于C#类型(即typeof(MyClass))的鉴别器,而没有任何可用的对象实例。这使得不可能从外部id字符串中提取区分符,因为我当时没有这样的字符串,并且无法创建一个。

我正在使用,Eco.Services.Impl.ExternalIdServiceImpl_DbType因此外部ID的类型标识符与数据库中的类型标识符匹配,以防万一。但是,如何在运行时查找类型的鉴别符?

凯尔·里尔伯(Kjell Rilbe)

找到源代码后,Eco.Services.Impl.ExternalIdServiceImpl_DbType我便可以创建此解决方案:

public static string GetClassDiscriminator<T>(this IEcoServiceProvider sp)
{
    IEcoTypeSystem typeSys = sp.GetEcoService<ITypeSystemService>().TypeSystem;
    IClass cls = typeSys.AllClasses.Cast<IClass>().First(c => c.ObjectType == typeof(T));
    if (sp.GetEcoService<IExternalIdService>() is Eco.Services.Impl.ExternalIdServiceImpl_DbType)
    {
        ORMappingDefinition mapping = ((PersistenceMapperDb)DiamondsPMP.Instance.PersistenceMapper).EffectiveRunTimeMappingProvider.Mapping;
        if (mapping == null)
            throw new InvalidOperationException(PersistenceStringRes.MappingProviderNotInitialized);
        ClassDefinition classdef = mapping.Classes[typeSys.AllClasses[0].Name];
        if (classdef.Discriminators.Count == 0)
            throw new InvalidOperationException(PersistenceStringRes.RootclassHasNoDiscriminatorDefined);
        DiscriminatorDef discriminator = classdef.Discriminators.Cast<DiscriminatorDef>().First();
        DiscriminatorValue discvalue = discriminator.DiscriminatorValuesByClassId(cls.InternalIndex);
        if (discvalue == null)
            throw new InvalidOperationException(PersistenceStringRes.ClassHasNoDiscriminatorValueDefined);
        if (discvalue.IsFinal && cls.SubTypes.Count > 0)
            throw new InvalidOperationException(PersistenceStringRes.DiscriminatorIsFinal);
        return discvalue.Value;
    }
    else
        return cls.InternalIndex.ToString();
}

sp.GetEcoService<IExternalIdService>() is Eco.Services.Impl.ExternalIdServiceImpl_DbType在我的情况下,是必需的,因为在我的单元测试中,我使用PersistenceMapperMemory,该索引将inTypeSystem.AllClasses用作区分类型,这也是所返回的值IClass.InternalIndex

我也注意到那IExternalIdService.ObjectForIdSeperateClassInfo()是越野车。它就像Eco.Services.Impl.ExternalIdServiceImpl正在使用一样,返回IObjectInstance错误的类型(使用中的类的索引TypeSystem.AllClasses)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章