C# 如何获取类的类型鉴别器?

C# 如何获取类的类型鉴别器?,c#,mdriven,model-driven-development,C#,Mdriven,Model Driven Development,在MDriven中,我希望在运行时获得建模类的类型鉴别器。我以为我以前做过,但似乎找不到也弄不明白 我指的是在外部id字符串中首先出现的整数,例如外部id“72!i64!12345678”中的“72” 我需要获得基于C#type的鉴别器,即typeof(MyClass),而不需要任何可用的对象实例。这使得无法从外部id字符串中提取鉴别器,因为我当时没有这样的字符串,无法创建一个 我使用的是Eco.Services.Impl.ExternalIdServiceImpl\u DbType,因此外部i

在MDriven中,我希望在运行时获得建模类的类型鉴别器。我以为我以前做过,但似乎找不到也弄不明白

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

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


我使用的是
Eco.Services.Impl.ExternalIdServiceImpl\u DbType
,因此外部id的类型鉴别器与数据库中的类型鉴别器匹配,以防万一。但是如何在运行时查找类型的鉴别器呢?

鉴别器72也是类的TypeService列表中的索引

IClass umlClass = (IClass)TypeSystem.AllClasses[72];

在找到
Eco.Services.Impl.ExternalIdServiceImpl\u 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();
}
公共静态字符串GetClassDiscriminator(此IEcoServiceProvider sp)
{
IEcoTypeSystem typeSys=sp.GetEcoService().TypeSystem;
IClass cls=typeSys.AllClasses.Cast().First(c=>c.ObjectType==typeof(T));
if(sp.GetEcoService()是Eco.Services.Impl.ExternalIdServiceImpl_DbType)
{
ORMappingDefinition mapping=((PersistenceMapperDb)DiamondsPMP.Instance.PersistenceMapper.EffectiveRunTimeMappingProvider.mapping;
if(映射==null)
抛出新的InvalidOperationException(PersistenceStringRes.MappingProviderNotInitialized);
ClassDefinition classdef=mapping.Classes[typeSys.AllClasses[0].Name];
if(classdef.Discriminators.Count==0)
抛出新的InvalidOperationException(PersistenceStringRes.RootclassHasNoDiscriminatorDefined);
DiscriminatorDef discriminator=classdef.Discriminators.Cast().First();
鉴别器值discvalue=鉴别器。鉴别器值ByClass(cls.InternalIndex);
如果(discvalue==null)
抛出新的InvalidOperationException(PersistenceStringRes.ClassHasNoDiscriminatorValueDefined);
如果(discvalue.IsFinal&&cls.subtype.Count>0)
抛出新的InvalidOperationException(PersistenceStringRes.DiscriminatorsFinal);
返回discvalue.Value;
}
其他的
返回cls.InternalIndex.ToString();
}
sp.GetEcoService()是Eco.Services.Impl.ExternalIdServiceImpl_DbType
在我的例子中是必需的,因为在我的单元测试中,我使用
PersistenceMapperMemory
,它使用
TypeSystem.allClass
中的索引作为类型鉴别器,这也是
icClass.InternalIndex
返回的值


我还注意到,
IExternalIdService.objectforidSeprerateClassInfo()
有缺陷。它的作用就像正在使用
Eco.Services.Impl.ExternalIdServiceImpl
,返回错误类型的
IObjectInstance
(使用
TypeSystem.AllClasses
中的class'索引)。

字符串td=id.Split('!')[0]@CodingYoshi:不,请阅读我的澄清。其目的是从数字id号、id类型“i64”(已知)和鉴别器号创建外部id字符串,我需要以某种方式进行查找。注意-新版本支持在发送标识时添加描述器名称而不是数字:TheAllClassName!i64!12345678这对于发生变化的模型(所有模型都会发生变化)来说更为健壮-至少如果数字由第三方存储的话。在我的例子中,我试图构建外部化字符串,所以我需要相反的:
TypeSystem.AllClasses.IndexOf(umlClass)
。另外,这是否是
charpclassname!i64!12345678
ModeledClassName!i64!12345678
?@KjellRilbe-c#名称,我们称之为RuntimeName(用于大多数实际目的)是的-如果您有高级ORMapping实现,您可能在一个类上有多个鉴别器值-这将抵消db鉴别器对类索引的影响!在使用ExternaldServiceImpl_DbType服务时,我将修复ObjectForIdseprateClassInfo的问题。现在将覆盖它以使用正确的基于db的鉴别器值