C# 无效的强制转换异常:无法强制转换类型为'__动态可视属性';输入';BugFixApplication.DeBugInfo';

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

我尝试将强制转换属性变量键入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 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
的属性。