Маршалы для свойств в структуре

#c# #.net #wpf

Вопрос:

Я пытаюсь добавить геттеры и сеттеры в эту структуру, чтобы использовать ее в качестве источника элементов списка. Проблема в том, что это приводит к тому, что маршалы становятся недействительными, что не позволяет выполнять компиляцию. Каким был бы лучший вариант исправить это?

Атрибут «Маршалы» недопустим для этого типа объявления. Он действителен только для объявлений «поле, параметр, возврат».**

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct FileExplorerData
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 251)]
        public string name { get; set; }
        public FILETIME lastwrite { get; set; }
        public bool type { get; set; }
        public int size { get; set; }
    };
 

Комментарии:

1. Просто — MarshalAs не должно быть доступно для property

2. Да @T. S., в этом-то и проблема. У вас есть решение, которое вы можете порекомендовать?

3. [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Parameter | System.AttributeTargets.ReturnValue, Inherited=false)] — это ваше решение

4. Но зачем вам это нужно для источника данных? Это winforms или WPF?

5. @T. S. У меня есть список этих структур, которые я установил в качестве источника данных для представления списка WPF.

Ответ №1:

Вы можете указать базовое поле в качестве целевого объекта атрибута

 [field: MarshalAs(UnmanagedType.ByValTStr, SizeConst = 251)]
public string name { get; set; }
 

Это действительно с C# 7.3 . Смотрите документацию.