C# 无效的强制转换异常:无法强制转换类型为'__动态可视属性';输入';BugFixApplication.DeBugInfo';
我尝试将强制转换属性变量键入DeBugInfo类型 下面是类ExecuteCtangle的Main函数中的代码:C# 无效的强制转换异常:无法强制转换类型为'__动态可视属性';输入';BugFixApplication.DeBugInfo';,c#,exception,exception-handling,casting,runtime-error,C#,Exception,Exception Handling,Casting,Runtime Error,我尝试将强制转换属性变量键入DeBugInfo类型 下面是类ExecuteCtangle的Main函数中的代码: class ExecuteRectangle { static void Main(string[] args) { Rectangle r = new Rectangle(4.5, 7.5); r.Display(); Type type = typeof(Rectangle); //iterating
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle(4.5, 7.5);
r.Display();
Type type = typeof(Rectangle);
//iterating through the attribtues of the Rectangle class
foreach (Object attributes in type.GetCustomAttributes(false))
{
DeBugInfo dbi = (DeBugInfo)attributes;
if (null != dbi)
{
Console.WriteLine("Bug no: {0}", dbi.BugNo);
Console.WriteLine("Developer: {0}", dbi.Developer);
Console.WriteLine("Last Reviewed: {0}",
dbi.LastReview);
Console.WriteLine("Remarks: {0}", dbi.Message);
}
}
//iterating through the method attribtues
foreach (MethodInfo m in type.GetMethods())
{
foreach (Attribute a in m.GetCustomAttributes(true))
{
DeBugInfo dbi = (DeBugInfo)a;
if (null != dbi)
{
Console.WriteLine("Bug no: {0}, for Method: {1}",
dbi.BugNo, m.Name);
Console.WriteLine("Developer: {0}", dbi.Developer);
Console.WriteLine("Last Reviewed: {0}",
dbi.LastReview);
Console.WriteLine("Remarks: {0}", dbi.Message);
}
}
}
Console.ReadLine();
}
}
[DeBugInfo(45, "Zara Ali", "12/8/2012",
Message = "Return type mismatch")]
[DeBugInfo(49, "Nuha Ali", "10/10/2012",
Message = "Unused variable")]
class Rectangle
{
//member variables
protected double length;
protected double width;
public Rectangle(double l, double w)
{
length = l;
width = w;
}
[DeBugInfo(55, "Zara Ali", "19/10/2012",
Message = "Return type mismatch")]
public double GetArea()
{
return length * width;
}
[DeBugInfo(56, "Zara Ali", "19/10/2012")]
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
下面是DeBugInfo类:
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : Attribute
{
private int bugNo;
private string developer;
private string lastReview;
public string message;
public DeBugInfo(int bg, string dev, string d)
{
this.bugNo = bg;
this.developer = dev;
this.lastReview = d;
}
public int BugNo
{
get
{
return bugNo;
}
}
public string Developer
{
get
{
return developer;
}
}
public string LastReview
{
get
{
return lastReview;
}
}
public string Message
{
get
{
return message;
}
set
{
message = value;
}
}
}
和类矩形:
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle(4.5, 7.5);
r.Display();
Type type = typeof(Rectangle);
//iterating through the attribtues of the Rectangle class
foreach (Object attributes in type.GetCustomAttributes(false))
{
DeBugInfo dbi = (DeBugInfo)attributes;
if (null != dbi)
{
Console.WriteLine("Bug no: {0}", dbi.BugNo);
Console.WriteLine("Developer: {0}", dbi.Developer);
Console.WriteLine("Last Reviewed: {0}",
dbi.LastReview);
Console.WriteLine("Remarks: {0}", dbi.Message);
}
}
//iterating through the method attribtues
foreach (MethodInfo m in type.GetMethods())
{
foreach (Attribute a in m.GetCustomAttributes(true))
{
DeBugInfo dbi = (DeBugInfo)a;
if (null != dbi)
{
Console.WriteLine("Bug no: {0}, for Method: {1}",
dbi.BugNo, m.Name);
Console.WriteLine("Developer: {0}", dbi.Developer);
Console.WriteLine("Last Reviewed: {0}",
dbi.LastReview);
Console.WriteLine("Remarks: {0}", dbi.Message);
}
}
}
Console.ReadLine();
}
}
[DeBugInfo(45, "Zara Ali", "12/8/2012",
Message = "Return type mismatch")]
[DeBugInfo(49, "Nuha Ali", "10/10/2012",
Message = "Unused variable")]
class Rectangle
{
//member variables
protected double length;
protected double width;
public Rectangle(double l, double w)
{
length = l;
width = w;
}
[DeBugInfo(55, "Zara Ali", "19/10/2012",
Message = "Return type mismatch")]
public double GetArea()
{
return length * width;
}
[DeBugInfo(56, "Zara Ali", "19/10/2012")]
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
当我运行此代码时,我得到了所需的输出,即:
Length: 4.5
Width: 7.5
Area: 33.75
Bug No: 49
Developer: Nuha Ali
Last Reviewed: 10/10/2012
Remarks: Unused variable
Bug No: 45
Developer: Zara Ali
Last Reviewed: 12/8/2012
Remarks: Return type mismatch
Bug No: 55, for Method: GetArea
Developer: Zara Ali
Last Reviewed: 19/10/2012
Remarks: Return type mismatch
Bug No: 56, for Method: Display
Developer: Zara Ali
Last Reviewed: 19/10/2012
Remarks:
但我也遇到了未经处理的异常错误和程序崩溃:
Unhandled Exception: System.InvalidCastException: Unable to cast object of type
'__DynamicallyInvokableAttribute' to type 'BugFixApplication.DeBugInfo' at
BugFixApplication.ExecuteRectangle.Main(string[] args)
我不知道为什么会出现这种异常,也不知道如何修复 试试这个
foreach (Object attributes in type.GetCustomAttributes(false))
{
DeBugInfo dbi = attributes as DeBugInfo;
if (null != dbi)
{
.....
对方法属性使用相同的属性。试试这个
foreach (Object attributes in type.GetCustomAttributes(false))
{
DeBugInfo dbi = attributes as DeBugInfo;
if (null != dbi)
{
.....
对方法属性使用相同的属性。我不明白这个问题。显然,您获得的属性之一不是
DeBugInfo
。你看过从type.GetCustomAttributes(false)
返回的属性了吗?我不明白这个问题。显然,您获得的属性之一不是DeBugInfo
。你看过从type.GetCustomAttributes(false)
返回的属性了吗?哇+2没有任何解释,在黑暗中拍摄恭喜@Mark你能解释一下为什么会这样吗?@ASISDATA因为type.GetCustomAttributes()
方法返回不同类型的属性。使用此强制转换语法(DeBugInfo)attributes
意味着attributes
变量始终可以强制转换为DeBugInfo
。错误意味着情况并非如此。有属性
无法强制转换为DeBugInfo
。因此,使用属性作为DeBugInfo
会导致它尝试强制转换,但如果不能,则返回null。这就是答案的下一行检查null的原因。if
块将只处理可以投射到DeBugInfo
.wow+2的属性,无需任何解释,并在黑暗中拍摄恭喜@Mark你能解释一下为什么会这样吗?@ASISDATA因为type.GetCustomAttributes()
方法返回不同类型的属性。使用此强制转换语法(DeBugInfo)attributes
意味着attributes
变量始终可以强制转换为DeBugInfo
。错误意味着情况并非如此。有属性
无法强制转换为DeBugInfo
。因此,使用属性作为DeBugInfo
会导致它尝试强制转换,但如果不能,则返回null。这就是答案的下一行检查null的原因。if
块将仅处理可转换为DeBugInfo
的属性。