Я работаю над реализацией клиента 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);