[OOP] Defining Classes Part Two - Задача 11


1

Условие: 11.Create a [Version] attribute that can be applied to structures, classes, interfaces, enumerations and methods and holds a version in the format major.minor (e.g. 2.11). Apply the version attribute to a sample class and display its version at runtime.
 

Въпрос: След като вече съм си създал клас атрибут и съм сложил на произволен  клас атрибут с версия: х, как мога да извлека тази информация и примерно да я изкарам на конзолата.

Ето какво съм написъл до сега: class Atributeа тук го прилагам.


в C# OOP от ivivanov (903 точки)


Отговори



5
Type type = typeof(CustomAttributesDemo);
object[] allAttributes =
type.GetCustomAttributes(false);
foreach (AuthorAttribute attr in allAttributes)
{
Console.WriteLine(
"This class is written by {0}. ", attr.Ver);
}

от Божидар Пенчев (0 точки)


0
CustomAttributesDemo - това ти е класа към които прилагаш атрибута.

от Божидар Пенчев (0 точки)

0
добрем, а как да достапя стойността на полетo ver. Имам и Porperty Ver, но "This class is written by {0}. ", attr.Ver); не ми позволява да го извикам... attr.Ver ...

от ivivanov (903 точки)



0
http://pastebin.com/eCmmUGKA
Идеята е, че класът може да има и други атрибути, а и не е много ясно в какъв ред ще ги вземем когато извикаме GetCustomAttributes().



3

Конвенцията е името на класа-атрибут за завършва на Attribute - VersionAttribute.

Така ще може да сложиш по-хубаво име на property-то Ver - примерно Version :-)

Какво става, когато сложим атрибута Version на метод или enumeration?

Тук съм пробвал и тези варианти.

https://github.com/vic-alexiev/TelerikAcademy/tree/master/OOP/Homework%20Assignments/2.%20Defining%20Classes%20Part%20II/11.%20VersionsDemo


от vic.alexiev (2299 точки)


0
Благодаря за пояснението ;) Fixed !

от ivivanov (903 точки)

0
Здравей,
може ли да обясниш как правиш MethodInfo[] и как прилагаш след това, за да изкараш версията на метода? Аз не можах да го направя и не можах да разбера как го правиш ти, ще съм благодарен, ако ми напишеш малко разяснения :)




5

Направила съм атрибута и класа, върху който се прилага в един и същи клас файл, което не е много правилно, но е по-събрано в случая.

Декларирам къде се ползва атрибута за версия, автоматични пропъртита и един конструктор. Прилагам атрибута върху един клас.

http://pastebin.com/AWxS43eC

Подробни обяснения съм качила на блога си.

http://ushort.wordpress.com/2013/03/15/attributes_cshar/




0

Аз правя атрибута по малко по-различен начин. Приемам го като стринг, но го записвам като две целочислени променливи. По този начин се осигурява, че винаги ще е в формата "major.minor", като се извика с ToString(), пък и може по отделно да се провери главната и второстепенната версия. И тъй като е нужен конкретен формат хвърля изключение ако е нарушен.

Ако се подаде версия като "2.11.9.2" или нещо подобно се записва само "2.11", и е задължително първите две цифри да са в правилния формат.

Това е моето решение, ще съм благодарен ако споделите дали е правилно да се направи по този начин.




0
Аз съм го направил със същата идея ,да се ползва "major.minor", но по малко по-различен начин , не знам дали е верен :) public int Major { get; set; } public int Minor { get; set; } public string Versions;
public Version(int major, int minor) { this.Major = major; this.Minor = minor; this.Versions = string.Format("{0}.{1}", major, minor); } и после си го извикваш така: [Version(2,35)]



0

Здравейте,

Ето и моя опит по тази задача. Използвал съм стандартния начин да извикам версията, както и чрез рефлекция, за методите вътре в класа. За енумерациите, които са вътрешни за класа използвам масив от Type и вътре GetNestedType, изцяло по идея на колегата @vic.alexiev, на когото благодаря, че ме въведе малко в тези рефлекции (отражения).




0

VersionAttribute

Правим си клас VersionAttribute, наследяваме клас Attribute. Създаваме две property-та MajorVersion и MinorVersion (в setter-ите правим проверка дали подаденото число не е отрицателно, защото ще бъде странно да имаме версия -10.2 или нещо от сорта). Накрая предефинираме метода ToString(), за принтиране на версията.




-1
Тук съм решил всичките задачи - http://project10telerik.cloudvps.bg/?p=382
Поздрави :)

от bigerbite (33 точки)


4

Ето я мойта задача : 

https://github.com/wIksS/Telerik/tree/master/OOP/DefiningClasses-Part-2/Attribute

Като цяло няма много какво да се обеснява по тази задача.

1. Правя клас, който наследява базовият клас System.Attribute.

2. Правя си атрибута във същият namespace. Този атрибут може да се използва от : структури, класове, интерфейси, енумерации и методи.

3. Правя полета за magor и minor. Стойностите им ги чета във конструктора.

4. След това, както е показано във примера от презентацията правя тип от тип - тип  от (VersionDemo) (класат, на който ще го прилагам) и след това правя масив от обекти като в него слагам custom атрибутите.

5. Накрая със foreach печатам елементите на масива от обекти. Като тези елементи са magor и minor. Печатам ги така : magor.minor (както е по условие).


от tddhome (3086 точки)


2

https://github.com/ttitto/tlrkOOPHomeworks/tree/master/DefiningClasses2HW

Задачата е с малко възможности за импровизация. Това, което ми се стори добре да се направи е, да се пренапише ToString() методът за VersionAttribute - класа, така че директно да извежда major.minor.

при отпечатването на атрибута умишлено съм гледал да го направя на един ред, защото някакси ми е по-лесно да го възприема и запомня. В случая няма смисъл от обхождане на масива с атрибути, защото се знае, че е само един.


от ttitto (1950 точки)


2

Решение : source

Класа VersionAttribute наследява класа за потребителски атрибути Attribute и казвам върху кои структури може да се прилага. С публичното свойство GetVersion връщам версията в формат major + "." + minor. За извличането на информацията за VersionAttribute използвам класовете MemberInfo и MethodInfo.


от stanchev (197 точки)