📜  C#动态编码–深度属性

📅  最后修改于: 2021-05-29 20:22:48             🧑  作者: Mango

.NET通用语言通过引入属性来提供在运行时动态编码实践的实现,这些属性使将在编译时生成并嵌入到.NET程序集中的自定义元数据与程序元素相关联。此外,可以通过采用称为反射的.NET机制轻松检查这些元数据。因此,本文使您可以从动态编程的角度简要了解.NET属性的用法。

属性

从System.Attribute类派生的属性。属性可以放置在大多数显示上,但是,特定的特征可能会限制其实质性的表示形式。在.NET代码中,我们可以通过将用方节([])括起来的属性名称放在要应用它的元素的声明上来确定属性。此外,我们可以利用质量将额外的元数据合并到一起。更重要的是,属性类似于描述性单词,用于元数据解释,例如可应用于给定种类的COM组件,集合,模块,技术等等。这是.NET编程中属性的语法,如下所示;

[type: attributeName(parameter1, parameter2, ………n)]

.NET构造为属性的使用指定两种类型的属性,即“预定义属性”或“自定义属性”。属性通常可以具有零个或多个参数。因此,以下C#代码构成了Attributes的执行,其中使用过时的as声明方法已弃用;

using System;
  
namespace attributes {
class Program {
    static void Main(string[] args)
    {
        Console.WriteLine("C# Dynamic code sample");
        // Deprecated method call
        TestMethod();
        Console.ReadKey();
    }
    // "declaring the TestMethod() as Obsolete by attrribute"
    [Obsolete("Deprecated function", false)] public static void TestMethod()
    {
        Console.WriteLine("geeksForGeeks");
    }
}
}

.NET框架的ILDASM实用程序可以通过以下方式利用来验证过时属性在相应前述代码的生成的MSIL代码中的输入;

C#动态编码-深度属性

ILDASM实用程序将IL代码背后的代码生成到.NET程序集,因此,双击过时的方法myFun()条目,它将如下所示反映“过时”属性的条目;

C#动态编码-深度属性

属性用于信息定义,反射,Web服务,序列化,设置类蓝图以及在运行时指定第三方库的目的。总体而言,从文档角度来看,这有利于在元数据表中进行输入。此外,编译过程会在调试过程中自动发现属性条目的存在。 .NET框架在源代码中规定了Custome和Predefined属性。即将到来的部分描述了代码中一些预定义属性的实现。

序列化

让我们看一下下面的类代码,它们具有带有非序列化字段的序列化属性的含义,如下所示;

// Serialization class declaration with attribute
[Serializable] public class xyz {
    public xyz() {}
  
    string custName;
    string Address;
    // Non- serialized method attribute
    [NonSerialized] int MobPhone;
}

我们可以再次适当地检查序列化和非序列化属性在IL代码中的输入,如下所示;

DllImport

下面的代码示例说明了[DllIport]属性的功能,该属性调用非托管dll user32.dll来填充消息框,如下所示;

public class xyz {
    // Dll Import API call for MessageBox display
    [DllImport("user32.dll", EntryPoint = "MessageBox")]
        // MessageBox property configuration
        public static extern int
        ShowMessageBox(int hWnd, string text, string caption, uint type);
}
class Program {
    static void Main(string[] args)
    {
        // Property value initialized
        string caption = "geeksForGeeks";
        string text = "[DLLImport] Attribute";
        // Calling static method of xyz class
        xyz.ShowMessageBox(0, text, caption, 0);
        Console.ReadKey();
    }
}

到目前为止,我们已经体验了预定义的属性,在本系列中,我们也可以进一步开发自己的自定义属性,并在其他代码中加以利用。为此,该类必须带有属性前缀并派生到System。属性类如下;

class Program {
    static void Main(string[] args)
    {
        xyz obj = new xyz("GeeksforGeeks", "Hyderabad");
        Console.WriteLine(obj.FullDetails());
        Console.ReadKey();
    }
}
public class xyz {
    public xyz(string name, string country)
    {
        this.Name = name;
        this.City = country;
    }
    public string FullDetails()
    {
        string str = Name + "-" + City;
        return str;
    }
  
    private string Name;
    private string City;
}
// Custom Attribute Class
[AttributeUsage(AttributeTargets.Class)] public class custAttribute : Attribute {
    // Constructor
    public custAttribute(string s)
    {
        this.CompanyName = s;
    }
    public string CompanyName
    {
        get;
        set;
    }
}

编译完上述代码后,我们可以使用ildasm.exe来观察在元数据级别发生的自定义属性注释;