c# 代码常用 2017(为自己)

    xiaoxiao2021-03-25  92

     

    //

    Path.GetInvalidFileNameChars() Path.GetInvalidPathChars() 注意上面的两个方法在不同的平台上表现存在不一致的输出。

     Path.GetInvalidFileNameChars()Path.GetInvalidPathChars()Windows总共41个字符 ascii: 0-31 34 " 60 < 62 > 124 | 58 : 42 * 63 ? 92 \ 47 /总共36个字符 ascii : 0-31, 34 ", 60 <, 62 >, 124Linux(Android)2个字符 ascii:0 47 /1个字符 ascii:0

    /

    在C#的浮点数计算中,0除以0将得到NaN,正数除以0将得到PositiveInfinity,负数除以0将得到NegativeInfinity。C#中浮点数运算从不引发异常。

     

    double a = 0 / 0d; if (double.IsNaN(a)){ //此处判断a为NaN }

    Double.NaN 字段

    Double.NaN字段表示不是数字 (NaN) 的值。 此字段为常数。

    下面的代码示例演示 NaN 的用法:

     

    Double zero = 0; // This condition will return false. if ((0 / zero) == Double.NaN)   Console.WriteLine("0 / 0 can be tested with Double.NaN."); else   Console.WriteLine("0 / 0 cannot be tested with Double.NaN; use Double.IsNan() instead.");

    2<<3 010 变成010000

    010000 >> 3  2

    字符串拼接+和concat的区别

    +可以是字符串或者数字及其他基本类型数据,而concat只能接收字符串。

    +左右可以为null,concat为会空指针。

    如果拼接空字符串,concat会稍快,在速度上两者可以忽略不计,如果拼接更多字符串建议用StringBuilder。

    从字节码来看+号编译后就是使用了StringBuiler来拼接,所以一行+++的语句就会创建一个StringBuilder,多条+++语句就会创建多个,所以为什么建议用StringBuilder的原因。

    C# 反射扩展

    using System; using System.Reflection;

    public static class AccessExtensions {     public static T InvokeConstructor<T>(this Type type, Type[] paramTypes = null, object[] paramValues = null)     {         return (T)type.InvokeConstructor(paramTypes, paramValues);     }     public static object InvokeConstructor(this Type type, Type[] paramTypes = null, object[] paramValues = null)     {         if (paramTypes == null || paramValues == null)         {             paramTypes = new Type[] { };             paramValues = new object[] { };         }         var constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, paramTypes, null);         return constructor.Invoke(paramValues);     }     public static T Invoke<T>(this object o, string methodName, params object[] args)     {         var value = o.Invoke(methodName, args);         if (value != null)         {             return (T)value;         }         return default(T);     }     public static T Invoke<T>(this object o, string methodName, Type[] types, params object[] args)     {         var value = o.Invoke(methodName, types, args);         if (value != null)         {             return (T)value;         }         return default(T);     }     public static object Invoke(this object o, string methodName, params object[] args)     {         Type[] types = new Type[args.Length];         for (int i = 0; i < args.Length; i++)             types[i] = args[i] == null ? null : args[i].GetType();         return o.Invoke(methodName, types, args);     }     public static object Invoke(this object o, string methodName, Type[] types, params object[] args)     {         var type = o is Type ? (Type)o : o.GetType();         var method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, CallingConventions.Any, types, null);         if (method == null)             method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);         return method.Invoke(o, args);     }     public static T GetFieldValue<T>(this object o, string name)     {         var value = o.GetFieldValue(name);         if (value != null)         {             return (T)value;         }         return default(T);     }     public static object GetFieldValue(this object o, string name)     {         var field = o.GetType().GetField(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);         if (field != null)         {             return field.GetValue(o);         }         return null;     }     public static void SetFieldValue(this object o, string name, object value)     {         var field = o.GetType().GetField(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);         if (field != null)         {             field.SetValue(o, value);         }     }     public static T GetPropertyValue<T>(this object o, string name)     {         var value = o.GetPropertyValue(name);         if (value != null)         {             return (T)value;         }         return default(T);     }     public static object GetPropertyValue(this object o, string name)     {         var property = o.GetType().GetProperty(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);         if (property != null)         {             return property.GetValue(o, null);         }         return null;     }     public static void SetPropertyValue(this object o, string name, object value)     {         var property = o.GetType().GetProperty(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);         if (property != null)         {             property.SetValue(o, value, null);         }     } }

    ///

    Environment.CurrentDirectory  在Unity里,是到,打开 显示 Assets和ProjectSettings的那层

    修改文件夹里的文件名:因为我的lua文件(后缀为.lua)被莫名其妙的改成文本文件,并且后缀都变成.lua.txt

    string inputPath = "C:/Users/Administrator/Desktop/Client7/Assets";             if (!Directory.Exists(inputPath)) return ;              string[] pathArr = Directory.GetFiles(inputPath, "*.Lua.txt", SearchOption.AllDirectories);             Console.WriteLine("pathArr : " + pathArr.Length);             for (int i = 0; i < pathArr.Length; i++)             {                 Console.WriteLine("pathArr:   " + pathArr[i]);                 //pathArr[i] = pathArr[i].Replace(".lua", "");                 string newPath = System.IO.Path.ChangeExtension(pathArr[i], ".lua");                 File.Move(pathArr[i], newPath);                 Console.WriteLine("bb:   " + newPath);             }

     

    引用类型 深拷贝:

     

    public static T DeepClone<T>(T obj)         {             using (var ms = new MemoryStream())             {                 var formatter = new BinaryFormatter();                 formatter.Serialize(ms, obj);                 ms.Position = 0;                 return (T) formatter.Deserialize(ms);             }         }

     

     

     

    枚举遍历

    public enum EMyType 

        [System.ComponentModel.Description("A类型")] 

        TypeA = 1, 

        [System.ComponentModel.Description("B类型")] 

        TypeB = 1, 

        [System.ComponentModel.Description("C类型")] 

        TypeC = 2, 

    }   

    接着遍历其枚举名的方法是

    [csharp] view plain copy

    foreach (var name in Enum.GetNames(typeof(EMyType))) 

        Console.WriteLine(name); 

    接着遍历其枚举名与枚举值的方法是

    [csharp] view plain copy

    foreach (var value in Enum.GetValues(typeof(EMyType))) 

        Console.WriteLine(string.Format("{0}={1}", value.ToString(), Convert.ToInt32(value))); 

    接着遍历其枚举名,枚举值与描述属性的字符串的方法是

    [csharp] view plain copy

    foreach (var value in Enum.GetValues(typeof(EMyType))) 

        object[] objAttrs = value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), true); 

        if (objAttrs != null &&  

            objAttrs.Length > 0) 

        { 

            DescriptionAttribute descAttr = objAttrs[0] as DescriptionAttribute; 

            Console.WriteLine(string.Format("[{0}]", descAttr.Description)); 

        } 

        Console.WriteLine(string.Format("{0}={1}", value.ToString(), Convert.ToInt32(value))); 

    }

    枚举反射,根据枚举中的val或者data读取值和描述

    举例实用:

    1 Type t = Assembly.Load("XXX.SDK").GetType("XXX.SDK.Entities." + ObjType); 2 var dataList = new List<object>(); 3 foreach (var value in Enum.GetValues(t)) 4 { 5 6 object[] objAttrs = value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), true); 7 DescriptionAttribute descAttr = objAttrs[0] as DescriptionAttribute; 8 var date = new 9 { 10 Description = descAttr.Description, 11 Name = value.ToString(), 12 value = Convert.ToInt32(value) 13 }; 14 dataList.Add(date); 15 }

    根据枚举的名字,读出枚举的描述,内容和值。

      UserCardStatus userCardStatu = (UserCardStatus)Enum.Parse(typeof(UserCardStatus), result.user_card_status, true); string txt = GetEnumDescription(userCardStatu); public string GetEnumDescription(Enum enumValue) { string str = enumValue.ToString(); FieldInfo field = enumValue.GetType().GetField(str); object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false); if (objs == null || objs.Length == 0) return str; DescriptionAttribute da = (DescriptionAttribute)objs[0]; return da.Description; }

     

    根据枚举的单个内容,读出描述

    转载请注明原文地址: https://ju.6miu.com/read-22559.html

    最新回复(0)