我有这个非常基本的类库,它继承自System.Attribute。我还将它作为程序集签名,因此dll可以在另一个程序中使用。
namespace BearData
{
public class BearData : Attribute
{
private string[] array1;
private string bear = "Bear";
private int weight;
public BearData(string bear)
{
this.bear = bear;
}
public string Bear
{
get
{
return bear;
}
set
{
bear = value;
}
}
public int Weight
{
get
{
return weight;
}
set
{
weight = value;
}
}
public string[] BearTypes()
{
array1 = new string[8];
array1[0] = "Brown/Grizzly";
array1[1] = "Polar";
array1[2] = "Asian Black";
array1[3] = "American Black";
array1[4] = "Sun";
array1[5] = "Sloth";
array1[6] = "Spectacled";
array1[7] = "Giant Panda";
return array1;
}
}
}
此处它用于基本控制台应用程序。然而,由于我的教授的神秘,模糊和神秘的性质,我仍然站在这个工作的立场。我从这一行得到一个错误:
bearAttribute = (BearData.BearData)attrs[0];
"未处理的类型' System.IndexOutOfRangeException' 发生在Assigntment5_Console.exe"是确切的错误。
我想我的具体问题是什么导致了这个错误?
但更一般地说,当它们来自外部库时,这是一种使用属性的好/正确方法吗?我觉得这里有随机数组并且我将数组转换为属性类似乎很奇怪?
顺便说一下。这就是我的教授为单个Visual Studio实例中隔离的属性类编写代码的方式。他还有一个类库dll导出的例子,我被留给自己的设备来弄清楚如何组合2。
using BearData;
namespace Assigntment5_Console
{
class Program
{
[BearData.BearData("Bear", Weight = 1000)]
static void Main(string[] args)
{
MemberInfo attributeInfo;
attributeInfo = typeof(BearData.BearData);
object[] attrs = attributeInfo.GetCustomAttributes(false);
//for (int i = 0; i < attrs.Length; i++)
//{
// Console.WriteLine(attrs[i]);
//}
BearData.BearData bearAttribute;
bearAttribute = (BearData.BearData)attrs[0];
Console.WriteLine("Animal: " + bearAttribute.Bear + "\nAverage Weight: " + bearAttribute.Weight);
Console.ReadLine();
}
}
}
答案 0 :(得分:1)
你已经在Program.Main()方法上定义了BearData属性,所以你应该在那里寻找属性
以下代码应解决您的问题
namespace Assigntment5_Console
{
class Program
{
[BearData.BearData("Bear", Weight = 1000)]
static void Main(string[] args)
{
MethodBase method = MethodBase.GetCurrentMethod();
object[] attrs = method.GetCustomAttributes(typeof(BearData.BearData), true);
BearData.BearData bearAttribute;
bearAttribute = (BearData.BearData)attrs[0];
Console.WriteLine("Animal: " + bearAttribute.Bear + "\nAverage Weight: " + bearAttribute.Weight);
Console.ReadLine();
}
}
}