Недопустимое приведенное исключение: невозможно привести объект типа ‘__DynamicallyInvokableAttribute’ к типу ‘BugFixApplication.DeBugInfo’

#c# #exception #exception-handling #casting #runtime-error

#c# #исключение #Кастинг #ошибка времени выполнения

Вопрос:

Я попытался ввести переменную атрибута приведения к типу DeBugInfo.

Вот код в функции Main в классе ExecuteRectangle:

 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:

 [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;
        }
    }
}
  

И класс Rectangle:

   [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)
  

Я не знаю, почему я получаю это исключение и как я могу это исправить.

Комментарии:

1. Я не понимаю вопроса. Очевидно, что один из атрибутов, которые вы получаете, не является DeBugInfo . Вы смотрели на атрибуты, возвращенные из type.GetCustomAttributes(false) ?

Ответ №1:

Попробуйте это

 foreach (Object attributes in type.GetCustomAttributes(false))
{
    DeBugInfo dbi = attributes as DeBugInfo;
    if (null != dbi)
    {
        .....
  

Используйте то же самое для атрибутов метода.

Комментарии:

1. вау 2 без каких-либо объяснений и делаю снимок в темноте, поздравляю!

2. @Mark не могли бы вы, пожалуйста, объяснить, почему такое поведение?

3. @AsisDatta, потому что type.GetCustomAttributes() метод возвращает атрибуты с разными типами. Использование этого синтаксиса приведения (DeBugInfo)attributes подразумевает, что attributes переменная всегда и определенно может быть приведена к DeBugInfo . Ошибка означает, что это не так. Есть, attributes которые не могут быть приведены к DeBugInfo . Таким образом, использование attributes as DeBugInfo заставляет его пытаться выполнить приведение, но возвращает null, если это невозможно. Вот почему следующая строка ответа проверяется на null. if Блок будет обрабатывать только атрибуты, к которым можно привести DeBugInfo .