У меня есть пользовательские атрибуты и классы, которые используют эти атрибуты. Эти атрибуты используются для Property Grid, когда объект класса выбран. В настоящее время оба класса и атрибуты находятся в одной и той же сборке. Внутри атрибутов у меня есть некоторые объекты Form. Из-за этих объектов Form я хочу сохранить атрибуты в отдельной сборке. Однако это приводит к циклической ссылке. Не могли бы вы помочь мне в этом вопросе?C# сохранение пользовательских атрибутов в отдельной сборке
Пример:
У меня есть бизнес-объект, свойство может быть отображено в PropertyGridControl:
public class Field
{
public Field()
{
}
private int _Type;
[CustomPropertyEditorMarker(typeof(RepositoryItemForFieldDataType))]
public int Type
{
get { return _Type; }
set
{
_Type = value;
}
}
}
[AttributeUsage(AttributeTargets.Property)]
public sealed class CustomPropertyEditorMarker : Attribute
{
public CustomPropertyEditorMarker(Type editorType)
{
EditorType = editorType;
}
public readonly Type EditorType;
}
public sealed class RepositoryItemForFieldDataType : RepositoryItemLookUpEdit
{
public RepositoryItemForFieldDataType()
{
// Populating LookupEdit details here
}
private void On_ButtonClick()
{
// Here initializing existing Form class and show it
}
}
When Field object is selected, PropertGridControl analyze selected object and checking which property has above Attribute. If yes, then initialize it.
private void SelectObject(object obj)
{
this.Rows.Clear();
this.DefaultEditors.Clear();
this.RepositoryItems.Clear();
if ((this.LastSelectedObject as ApplicationDomainItemBase) != null)
{
(this.LastSelectedObject as ApplicationDomainItemBase).IsSelected = false;
};
this.SelectedObject = null;
this.SelectedObject = obj;
if (!(this.SelectedObject is ConfigurationObjectManagerBase))
{
foreach (var propInfo in this.SelectedObject.GetType().GetProperties())
{
object[] objFieldAtts = propInfo.GetCustomAttributes(typeof(CustomPropertyEditorMarker), true);
if (objFieldAtts != null && objFieldAtts.Length > 0)
{
if (this.GetRowByFieldName(propInfo.Name) != null)
{
RepositoryItem repItem = Activator.CreateInstance(((CustomPropertyEditorMarker)objFieldAtts[0]).EditorType) as RepositoryItem;
this.GetRowByFieldName(propInfo.Name).Properties.RowEdit = repItem;
};
};
};
};
this.LastSelectedObject = obj;
}
В настоящее время оба классов бизнес-объектов и атрибутов находятся в одной сборке и должны разделить их. Однако я не могу, потому что свойство бизнес-объекта украшено именем атрибута и нужно будет добавить ссылку. Невозможно добавить ссылку, потому что классы атрибутов ссылаются на классы бизнес-объектов. Надеюсь, что это ясно. Благодарю.
Почему проект, в котором вы перемещаете атрибуты, ссылается на проект, который использует эти атрибуты? Можете ли вы предоставить более подробную информацию о своих зависимостях? – user3185569
@ user3185569, pls см. Правки. Благодарю. – Tim
Я вижу только один класс атрибутов в вашем примере кода и не ссылается ни на один из других классов. Что мне не хватает. Я не вижу, что мешает вам переместить этот класс атрибутов в отдельную сборку, а затем ссылаться на эту сборку из проекта, который содержит ваши объекты домена. – wablab