//
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字段表示不是数字 (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只能接收字符串。
+左右可以为null,concat为会空指针。
如果拼接空字符串,concat会稍快,在速度上两者可以忽略不计,如果拼接更多字符串建议用StringBuilder。
从字节码来看+号编译后就是使用了StringBuiler来拼接,所以一行+++的语句就会创建一个StringBuilder,多条+++语句就会创建多个,所以为什么建议用StringBuilder的原因。
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; }
根据枚举的单个内容,读出描述
