[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

GitHub

Първо си създавам атрибут който взима версия като стринг. След това по подобен на начина описан в презентацията го показвам 

foreach (VersionAttribute ver in allAttributes)
            {
                Console.WriteLine(ver.Version);
            }
 
В това се състои магията и се чудя дали няма начин да се достъпи само VersionAttribute измежду всички allAttributes без да се итерират.

от dzhenko (3893 точки)


0

Аз съм го направил така, че да се проверява какъв е атрибута, и  ако е някой, който очакваме, го обработваме:

Type type = typeof(Program);
// Get all class attributes
object[] classAttributes = type.GetCustomAttributes(false);
foreach (Attribute attr in classAttributes)
{
        if (attr is AuthorAttribute)
                Console.WriteLine("Author: {0}"(attr as AuthorAttribute).Author);
 
        if (attr is VersionAttribute)
                Console.WriteLine("Ver: {0}"(attr as VersionAttribute).Version);
}

 


от neutrino (3376 точки)


0
Колеги, имам едно питане, защо ако сложа атрибута на Generic class, не го открива?
var versionInfo = typeof(Matrix<>); var info = versionInfo.GetCustomAttributes(false); Console.WriteLine(info.Length);

Връща ми, че масива е празен, демек 0;
Ако направя друг клас, работи:
var versionInfo = typeof(AttributeTestClass); var info = versionInfo.GetCustomAttributes(false); Console.WriteLine(info.Length);
тука ми връща 1, демек открива атрибута?

п.п. Съвсем се ошашках. Колеги, защо не мога да извикам atribute.Verion..., вообще не ми излиза такова пропърти....
http://pastebin.com/VddG8Y2T

п.п.2 Оправих го като създадох нов масив и кастнах object към VersionAttribute, ама предполагам има читав начин...

var versionInfo = typeof(AttributeTestClass); var info = versionInfo.GetCustomAttributes(false); VersionAttribute[] tmp = new VersionAttribute[info.Length]; for (int i = 0; i < info.Length; i++) { tmp[i] = (VersionAttribute)info[i]; }
Console.WriteLine(tmp[0].Version);

от topsoft (420 точки)