CS0234 Ошибка при использовании Typebuilder для динамического создания типов - PullRequest
0 голосов
/ 10 января 2019

Я работаю над реализацией клиента OPC UA в C # с использованием OPC Foundation SDK, для пользовательских типов данных кажется, что это требует динамического создания типов с использованием данных, считываемых из SDK.

У меня возникает проблема, когда динамически созданный тип является подтипом другого динамически создаваемого типа, когда я пытаюсь получить доступ к переменной родительского типа, я получаю сообщение об ошибке «CS0234: имя типа или пространства имен» 'не существует в пространстве имен' Приложение '(вам не хватает директивы using или ссылки на сборку?) ".

Код довольно длинный, и в любом случае он не будет работать без сервера OPC UA, поэтому публикация проверяемого примера затруднена :(

Любые идеи приветствуются, так как я несколько дней вырывал свои волосы!

//beginning of type creation
var encodingId = foundCustomTypes[name];

var typeBuilder = moduleBuilder.DefineType(name.Name, TypeAttributes.Public | TypeAttributes.Class, typeof(GenericEncodeable));

typeBuilder.AddInterfaceImplementation(typeof(IEncodeable));

//BuildDynamicProperty(typeBuilder, NodeIdString, typeof(uint), (uint)encodingId.Identifier);
BuildDynamicProperty(typeBuilder, NodeIdString, typeof(uint), (uint)tempintref);
tempintref += 1; 
BuildDynamicProperty(typeBuilder, NamespaceString, typeof(string), encodingId.NamespaceIndex.ToString());


//addition of known sub-type
{
    typeType= typeType.Replace(TnsPrefixString, string.Empty );
    var knownType = _createdTypeDictionary.Values.FirstOrDefault(t =>
        t.FullName.Equals(typeType));  

    propertyType = knownType;
    if (subsubChild.Attributes[LengthFieldString]?.Value != null)
    {    
        propertyType = propertyType?.MakeArrayType();                                         
    }
}
if (propertyType != null)
{                                                                        
    BuildDynamicProperty(typeBuilder, typeName, propertyType, string.Empty, true);
}



//actual creation of type
Type createdType = typeBuilder.CreateType();                                           
_createdTypeDictionary.Add(encodingId, createdType);

_session.Factory.AddEncodeableType(encodingId, createdType);
var test = Activator.CreateInstance(createdType); 
...