Скомпилируйте класс с атрибутами и загрузкой
Не уверен, почему это не работает, в основном это мой код:
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.OutputAssembly = @"C:\myclass.dll";
string code = @"
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
namespace First
{
public class B
{
public List<string> list = new List<string>();
[DisplayName(""Pos""),Category(""Test""),DefaultValue(0),DefaultValueAttribute(0)]
public int Position { get; set; }
}
}
";
CompilerResults r = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters, code);
var DLL = Assembly.LoadFile(parameters.OutputAssembly);
foreach (Type type in DLL.GetExportedTypes())
{
dynamic c = Activator.CreateInstance(type);
_props.SelectedObject = c;
}
Загрузка класса в сетку свойств работает нормально, но атрибуты игнорируются, есть идеи, почему? и есть ли решение для этого?
1 ответ
Решение
Прежде всего, ваш код даже не компилируется для меня. Требуются некоторые изменения.
- Вам нужно ссылку
System.dll
- Есть дубликат
DefaultValue
атрибут в вашем коде, вы должны удалить его
Трудно поверить, что вы собрали сборку с этим кодом. Я обновил код, и он работает как положено.
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.OutputAssembly = @"C:\myclass.dll";
parameters.ReferencedAssemblies.Add("System.dll");//Add reference
string code = @"
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
namespace First
{
public class B
{
public List<string> list = new List<string>();
[DisplayName(""Pos""),Category(""Test""),DefaultValue(0)]
public int Position { get; set; }
}
}
";
CompilerResults r = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters, code);
if (r.Errors.Count <= 0)
{
var DLL = Assembly.LoadFile(parameters.OutputAssembly);
foreach (Type type in DLL.GetExportedTypes())
{
dynamic c = Activator.CreateInstance(type);
_props.SelectedObject = c;
}
}