C#学习笔记12

1.在采纳反射时,反射能够绕过安全访谈等第(private、protected)修饰的类或质量,来博取须要的新闻。

2.泛型的反射:能够动用Type.ContainsGenericParameters这几个本性来判定三个类或格局是不是含有尚未安装的泛型实参,Type.IsGenericType属性表示是还是不是为泛型类型。

3.特点(Attribute):能够动用本性修饰类、接口。结构、枚举、委托、事件、属性、字段、方法、构造器、索引器、参数、类型参数、再次回到值、程序集、模块,使用性子的语法有2种,可为三个“[特色类型]”或“[特点类型,个性类型]”。对于里边列出大多数构造来讲,都足以应用方面包车型大巴语法标识,不过这么些语法不符合“重回值、程序集、模块”。

(1)程序集,[assembly:特性名]。

(2)模块,[module:特性名]。

(3)返回值,[return:特性名]。

4.大部风味只针对特定的布局实行修饰,为了制止本性不适于的使用,能够使用[AttributeUsageAttribute(AttributeTargets.xxx)]性格类进行标识脾性限制。

5.签字参数:如[AttributeUsage(AttributeTargets.Class,
AllowMultiple =
true)]语法有别于构造器开头化语法,因为AttributeUsageAttribute类并不带有多少个参数的构造器,尽管C#4.0帮助命名参数,但也是钦定方法本人所需的参数。签名参数是用来在特点构造器调用中设置一定的共用属性和字段,固然构造器不含有相应的参数,签名参数固然是可选的,但它同意对特色的附加实例数据举行安装,同不平时候没有须求提供贰个应和的构造器参数。

6.系列化(Serializable):本质上System.Runtime,Serialization.SerializationInfo对象是由“名称/值”对组合的聚合。在达成自定义的种类化时(需求贯彻ISerializable接口),内中会使用到SerializationInfo对象。

7.动态编制程序(Dynamic):反射的要紧意义之一便是动态查找和调用特定项指标二个成员,那需求在举行时辨认成员名或其余特色。在C#4.0中新扩充的动态编制程序-Dynamic,提供一个更简约的诀窍来经过反射调用成员,但这一个本领的限制在于,编译时索要知道成员名和签名。若举行时开掘实际远非那几个成员,调用就能够引发多少个RuntimeBinderException相当。可查阅UseDynamic.Test()代码。

8.Dynamic:究其向来,Dynamic是三个Object,存在任何对象都能隐式转变成Dynamic,Dynamic能够显式转变到其他对象,所以Dynamic在作为上就像Object,类似于Object,它依然为它的暗许值再次来到null(default(dynamic))。dynamic特殊动态行为只在调用时才会产出,那些作为是它与Object区分开来的关键。任何dynamic的积极分子调用都会回去为dynamic类型,但若对Dynamic施行GetType(),会回到是编写翻译好的连串(即最终赋值给动态变量的连串)。

9.落实自定义动态目的:定义自定义动态类型的要害是促成System.Dynamic.IDynamicMetaObjectProvider接口,可是不用从头完结,相反首先的方案是从System.Dynamic.DynamicObject类继承,不分厚薄写相应的主意。DynamicObject类已经落实了IDynamicMetaObjectProvider接口,提供了暗许管理。可查阅代码DynamicXml类,UseDynamic类中2个章程诺玛lMethod()与DynamicMethod()两个的可比。NormalMethod()方法应用相似的xml数据读取,DynamicMethod()方法运用了自定义动态指标深入分析xml内容。

图片 1图片 2

[Serializable]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class MyDescriptionAttribute : Attribute
{

}

public class UseDynamic
{
    public static void Test()
    {
        dynamic data = "Hello!  My name is Inigo Montoya";
        Console.WriteLine(data);
        data = (double)data.Length;
        data = data * 3.5 + 28.6;
        if (data == 2.4 + 112 + 26.2)
        {
            Console.WriteLine("data for length : {0}", data);
        }
        else
        {
            data.NonExistentMethodCallStillCompiles();
        }
    }

    public static void NormalMethod()
    {
        XElement person = XElement.Parse("<Person><Name>主神</Name><Age>26</Age></Person>");
        Console.WriteLine("{0},{1}", person.Descendants("Name").FirstOrDefault().Value, person.Descendants("Age").FirstOrDefault().Value);
    }

    public static void DynamicMethod()
    {
        dynamic person = DynamicXmL.Parse("<Person><Name>主神</Name><Age>26</Age></Person>");
        Console.WriteLine("{0},{1}", person.Name, person.Age);
    }
}

/// <summary>
/// 实现自定义的动态对象
/// </summary>
public class DynamicXmL : DynamicObject
{
    private XElement element;

    public DynamicXmL(XElement xElement)
    {
        element = xElement;
    }

    public static dynamic Parse(string text)
    {
        return new DynamicXmL(XElement.Parse(text));
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        bool success = false;
        result = null;
        XElement firstDescendant = element.Descendants(binder.Name).FirstOrDefault();
        if (firstDescendant != null)
        {
            if (firstDescendant.Descendants().Count() > 0)
            {
                result = new DynamicXmL(firstDescendant);
            }
            else
            {
                result = firstDescendant.Value;
            }
            success = true;
        }
        return success;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        bool success = false;
        XElement firstDescendant = element.Descendants(binder.Name).FirstOrDefault();
        if (firstDescendant != null)
        {
            if (value.GetType() == typeof(XElement))
            {
                firstDescendant.ReplaceWith(value);
            }
            else
            {
                firstDescendant.Value = value.ToString();
            }
            success = true;
        }
        return success;
    }
}

View
Code

—————–以上内容传闻《C#本质论
第三版》举办重新整建

相关文章