Внедрить свойство с пользовательским атрибутом -- c# поле с участием custom-attributes пол Связанный проблема

Implement property with custom attribute


0
vote

проблема

русский

Может быть, я получаю концепцию пользовательских атрибутов не так, но я подумал, что это должно быть что-то, что было бы возможно:

У меня есть класс со строчной собственностью. У меня есть несколько полученных классов со свойствами, которые в основном получают подконтность свойства BaseClass

 <код> class BaseClass {      public string MyString { get; set;} }  class FooClass : BaseClass {      public string Part1 { get { return MyString.SubString(0,3); }}      public string Part2 { get { return MyString.SubString(3,5); }} }  class BarClass : BaseClass {      public string PartA { get { return MyString.SubString(0,4); }}      public string PartB { get { return MyString.SubString(4,1); }} }   

У них также есть больниц, а настоящий код немного сложнее ... Но у вас есть картинка.

Я хотел бы не пришлось реализовать это тысячу раз, поэтому я думал использовать пользовательский атрибут. Так что я мог сделать:

 <код> class FooClass : BaseClass {      [DataPart(0, Length = 3)]      public string Part1 { get; set; }      [DataPart(3, Length = 5)]      public string Part2 { get; set; } }  class BarClass : BaseClass {      [DataPart(4, Length = 4)]      public string PartA { get; set; }      [DataPart(4)]      public string PartB { get; set; } }   

У меня уже есть пользовательский атрибут для него:

 <код> [global::System.AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] sealed class DataPartAttribute : Attribute {     public ushort Position { get; private set; }     public ushort Length { get; set; }      public DataByteAttribute(ushort position)     {         Position = position;     } }   

Что сейчас?

Английский оригинал

Maybe I'm getting the Concept of Custom Attributes wrong, but I thought this should be something that would be possible:

I'm having a class with a string property. I have multiple derived classes with properties that basically get a sub-string of the baseClass's property

class BaseClass {      public string MyString { get; set;} }  class FooClass : BaseClass {      public string Part1 { get { return MyString.SubString(0,3); }}      public string Part2 { get { return MyString.SubString(3,5); }} }  class BarClass : BaseClass {      public string PartA { get { return MyString.SubString(0,4); }}      public string PartB { get { return MyString.SubString(4,1); }} } 

They also have a setters, and the real code is a little bit more complex... But you got the picture.

I would like to not have to implement this a thousand times, so I was thinking of using a custom attribute. So I could do:

class FooClass : BaseClass {      [DataPart(0, Length = 3)]      public string Part1 { get; set; }      [DataPart(3, Length = 5)]      public string Part2 { get; set; } }  class BarClass : BaseClass {      [DataPart(4, Length = 4)]      public string PartA { get; set; }      [DataPart(4)]      public string PartB { get; set; } } 

I already have Custom Attribute for it:

[global::System.AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] sealed class DataPartAttribute : Attribute {     public ushort Position { get; private set; }     public ushort Length { get; set; }      public DataByteAttribute(ushort position)     {         Position = position;     } } 

What now?

</div
     

Список ответов

0
 
vote

Вам нужно написать код для обработки вашего пользовательского файла данныхAPArttribute с помощью отражения.

Возможно, вы должны подумать об использовании System.comPonentModel.dataNations.

для ex)

 <код> [StringLength(100, MinimumLength =30)]     public string Description { get; set; }   

Затем вы можете использовать экземпляр ObjectValidator, чтобы подтвердить свой объект.

 

You need to write code to process your custom DataPartAttribute by using reflection.

perhaps, you should think about using System.ComponentModel.DataAnnotations.

For ex)

[StringLength(100, MinimumLength =30)]     public string Description { get; set; } 

you can then use an instance of ObjectValidator to validate your object.

</div
 
 
0
 
vote

Вам нужно будет иметь атрибут hijack getter, чтобы вернуть что-то настраиваемое, что невозможно сделать с .NET в одиночку.

Видимо вы можете сделать это с продуктом, называемым postsharp (см. Ответ на Этот вопрос ).

Вы можете поставить код в Getter, чтобы посмотреть на атрибут и соответствовать строке, так что каждое свойство будет иметь точно такой же код. Я подозреваю, что это все, что постшарп будет делать. Но это будет работать хуже, чем использовать <код> .Substring в каждом добыче.

 

You would need to have the attribute hijack the getter to return something custom, which is not possible to do with .NET alone.

Apparently you can do it with a product called PostSharp (see the answer to this question).

You could put code in the getter to look at the attribute and build the string accordingly, so that every property would have the exact same code. I suspect this is all that PostSharp would do. But it would perform worse than using .Substring in every getter.

</div
 
 

Связанный проблема

157  Попытался прочитать или писать защищенную память. Это часто является признаком того, что другая память повреждена  ( Attempted to read or write protected memory this is often an indication that ot ) 
Я надеюсь, что кто-то может просветить меня относительно того, что может вызвать эту ошибку: попытался прочитать или писать защищенную память. Это часто яв...

1  Как иметь класс, используйте Getter / Setter по умолчанию при упоминании непосредственно в C #?  ( How to have a class use a default getter setter when referenced directly in c ) 
Допустим, у меня есть класс, как <код> class SecretInt { private int secret = 1; } Как я могу сделать это так, чтобы. <код> SecretInt a = new Secr...

770  Файл метаданных '.dll' не может быть найден  ( Metadata file dll could not be found ) 
Я работаю над проектом WPF, C # 3.0, и я получаю эту ошибку: <код> Error 1 Metadata file 'WORK=- ToolsVersionManagementSystemBusinessLogicLayerinDebug Busi...

1  Получите только имя от LDAP в ASP.NET C #  ( Get just the name from ldap in asp net c sharp ) 
Я хочу диаметровать все имена, которые совпадают с именем, имеющим имя с именем пользователя с сервера каталогов, используя LDAP и связывают его к виду сетки....

-2  Рассчитать номера диапазона IP из 2 заданных IP-адресов [Закрыто]  ( Calculate ip range numbers from 2 given ip addresses ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

1  Как изменить координаты текста на странице PDF из нижнего левого слева  ( How to change the coordinates of a text in a pdf page from lower left to upper l ) 
Я использую pdfbox и itextsharp dll и обработаю PDF. Так что я получаю текстовые координаты текста в прямоугольнике. Координаты прямоугольника извлекаются с п...

2  Компиляция страницы ASPX не удается  ( Aspx page compilation fails ) 
Мы разрабатываем веб-приложение, которое позволяет администраторам загружать плагины. Все плагины хранятся в специальной папке вне корня приложения (скажем, C...

2  Получение G-WAN для работы с моно  ( Getting g wan to work with mono ) 
Я следовал инструкциям на сайте G-WAN FAQ и прочитал руководство, но я не могу получить G-WAN, чтобы «увидеть» мономонтаж на мою установку Debian 6 (x64). Я...

2  Как создать файл XPS с веб-страницы, используя C #?  ( How to create xps file from web page using c ) 
Как создать файл XPS с веб-страницы, используя C #? Любые идеи? ...

3  Как использовать различные настройки приложения для различных конфигураций сборки?  ( How to use different application settings for different build configurations ) 
В верхней части афоризма - вкладка (красная) свойств проекта Есть 2 серых раскрывающихся коробки (зеленые), которые я хотел бы использовать. Я хочу измен...

2  Dotnetzip - чтение на память  ( Dotnetzip reading to memory ) 
Я собрал быстрый тест, используя библиотеку Dotnetzip, которая открывает ZIP-файл, полный файлов .bmp и преобразует их в формат .jpg. До этого я писал все ф...

-1  Ошибка - RaceOnrcwleanean был обнаружен во время параллельного метода Parallel.invoke  ( Error raceonrcwcleanup was detected during parallel invoke method ) 
Я пытаюсь экспортировать все листы файла Excel, используя следующую часть кода. Я звоню один метод, используя разные значения параметров. Это дает мне после...

0  Как использовать запрос LINQ для обновления базовой таблицы базы данных  ( How do i use a linq query to update the underlying database table ) 
Я использую сильно напечатанный набор данных, и я покажу свой псевдо-код ниже. То, что я пытаюсь сделать, это только выбрать только одно значение столбца из б...

0  DataGridTextColumn с десятичным значением, разрешить отсутствие ввода  ( Datagridtextcolumn with decimal value allow no entry ) 
Использование .NET 4.6. У меня есть DataGridTextColumn, связанный с decimal? свойства. (Мне нужна помощь от этого Ссылка , чтобы вообще работать.) Можно ...

1  C # код для объемного обновления SQL Server  ( C sharp code to bulk update sql server ) 
У нас есть этот код C #, который будет обновлять таблицу базы данных SQL Server на основе флагов в структуре. <код> public struct stSRK { public string...

Связанный проблема

157  Попытался прочитать или писать защищенную память. Это часто является признаком того, что другая память повреждена 
1  Как иметь класс, используйте Getter / Setter по умолчанию при упоминании непосредственно в C #? 
770  Файл метаданных '.dll' не может быть найден 
1  Получите только имя от LDAP в ASP.NET C # 
-2  Рассчитать номера диапазона IP из 2 заданных IP-адресов [Закрыто] 
1  Как изменить координаты текста на странице PDF из нижнего левого слева 
2  Компиляция страницы ASPX не удается 
2  Получение G-WAN для работы с моно 
2  Как создать файл XPS с веб-страницы, используя C #? 
3  Как использовать различные настройки приложения для различных конфигураций сборки? 
2  Dotnetzip - чтение на память 
-1  Ошибка - RaceOnrcwleanean был обнаружен во время параллельного метода Parallel.invoke 
0  Как использовать запрос LINQ для обновления базовой таблицы базы данных 
0  DataGridTextColumn с десятичным значением, разрешить отсутствие ввода 
1  C # код для объемного обновления SQL Server 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.