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

 

//

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 >,
124
Linux(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的区别

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

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

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

  4. 从字节码来看+号编译后就是使用了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;
        }

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值