Tag: 类型

C#将对象转换为Decimal

我正在尝试将值为0.39999999999999997的对象转换为十进制变量而不会丢失精度。 object d = 0.39999999999999997; 我尝试了以下方法。 decimal val1 = Convert.ToDecimal(d); // val1 = 0.4 object val2 = Convert.ChangeType(d, Type.GetType(“System.Decimal”)); // val2 = 0.4 decimal val3 = decimal.Parse(d.ToString()); // val3 = 0.4 decimal val4 = (Decimal) d; // val4 = 0.4 我知道这不是十进制数据类型无法存储此值的问题,如下所示。 decimal val5 = 0.39999999999999997m; // val5 = 0.39999999999999997; 如何在不丢失精度的情况下将此对象转换为十进制? 如果重要的话,我正在使用.NET Framework 3.5。

在幕后,C#/ .NET中十进制值类型发生了什么?

如何实现decimal类型? 更新 它是128位值类型(16字节) 1个符号位 尾数为96位(12字节) 指数为8位 剩余的比特(其中23个!)设置为0 谢谢! 我会坚持使用我自己的隐含比例的64位长。

检查double是否是C#中的整数有什么好方法?

可能重复: 如何确定十进制/双精度是否为整数? 我有一个double类型的变量,我想检查它是否是一个整数。 目前我有 public bool CheckIfInteger(double number) { return number.ToString().Contains(“.”) == false; } 有没有更好的办法? 更新:对不起我没有意识到混淆的可能性,整数我的意思是整数的数学定义,即自然数和非零自然数的负数。

C#:“漂亮”的类型名称function?

在generics类型的情况下,System.Type类的名称属性返回奇怪的结果。 有没有办法以更接近我指定方式的格式获取类型名称? 示例: typeof(List).OriginalName == “List”

从加载的程序集中查找实现接口的对象 – 如何比较类型?

我有一个类将加载目录中的所有程序集,然后获取所有类型,看看它们是否实现了一个接口。 我无法进行类型比较。 在调试器中,如果总是未通过比较,我会看到我的类型已加载(我感兴趣的那个)。 如果我在本地使用相同的比较代码,我没有问题,我得到了预期的结果。 我可以在类型接口上进行sting比较,但我更愿意知道我做错了什么。 测试: // Fails [Fact] public void FindISerialPortTest() { var path = Directory.GetCurrentDirectory(); var results = FindImplementers.GetInterfaceImplementor(path); results.Length.Should().Be(1); results[0].Should().BeAssignableTo(); } //Passes [Fact] public void DoesTypeImplementInterfaceTest() { var myType = typeof(SerialPortWrapper); var myInterface = typeof(ISerialPort); FindImplementers.DoesTypeImplementInterface(myType, myInterface).Should().Be(true); } class级: public class FindImplementers { public static T[] GetInterfaceImplementor(string directory) { if (String.IsNullOrEmpty(directory)) { […]

如何在编译时创建List 并通过System.Reflection.PropertyInfo复制项目

我遇到了一些相当复杂的东西。 如果有人能提供帮助,我将不得不承担责任。 1)我必须在编译时创建一个未知类型的List 。 我已经实现了。 Type customList = typeof(List).MakeGenericType(tempType); object objectList = (List)Activator.CreateInstance(customList); “temptype”是已经获取的自定义类型。 2)现在我有PropertyInfo对象,我必须将所有项目复制到我刚刚创建的实例“objectList” 3)然后我需要迭代并访问“objectList”的项目,就像它是“System.Generic.List”一样。 简而言之,使用reflection我需要提取一个列表属性并将其作为实例供进一步使用。 您的建议将不胜感激。 提前致谢。 Umair

Visual Studio默认自动完成以使用系统类型名称

奇怪的问题,但我的老板是一个触摸旧学校,并坚持我们的编码标准,我们不使用系统类型的C#缩写,他喜欢我们使用完整的系统名称。 他喜欢冗长的东西,我很乐意遵守标准。 然而,在几个月之后开始感谢我的事实是,visual studio在完成代码时不喜欢遵守标准。 所以,如果我输入: KeyValuePair MyValue = new Visual Studio将完成剩下的工作: KeyValuePair 实现接口或抽象类时,情况更糟。 这是一个小小的不便,但也有一个,我想知道在过多的VS选项中是否有一个强制使用完整的系统类型名称。 我相信这可以通过像Re-Sharper这样的东西来解决,但遗憾的是我无法获得许可证。 编辑 是的,他鄙视使用var关键字。 我应该说明他的实际推理,这是因为我们主要是在C#中发展,但很有可能需要用C语言和目标C写作,所以他不希望我们过于依赖CLR的缩写,他也说它会导致在移植代码时减轻痛苦,这在某种程度上对我有意义。 他的主要目的是避免类型错误匹配Int16,Int32和Int64等类型但是因为我们遵循标准他更喜欢String over string。 平心而论,如果不是一个老式学校,他是一个非常好的程序员,但他对引擎盖下的事物的知识远远超过我的知识,而我所知道的90%的开发者来自游戏背景,我想让你欣赏更精细更多地指出一点。 我总是被一个很好的托管.NET框架宠坏了。 非常感谢 保罗

为什么相同的类型不相等?

我正在开发一个小插件框架,并注意到我无法成功使用Type.IsAssignableFrom()来检查插件类是否实现了类型IPlugin 。 我检查了其他SO问题(比如这个) ,看看为什么函数返回false,但令我惊讶的是,没有一个建议有效。 我在插件程序PluginAPI.IPlugin有一个类,它在引用的程序PluginAPI.IPlugin实现PluginAPI.IPlugin类。 检查我的PluginAPI.IPlugin类型的AssemblyQualifiedName以及插件类的接口列表的类型时,我发现没有任何区别。 两者都超出了价值: PluginAPI.IPlugin,PluginAPI,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null 经过进一步调查,我检查了Type.cs源代码 ,发现函数IsAssignableFrom()在内部调用中失败,它检查类型是否相等(via == )。 我发现修改我的插件框架以在典型的执行上下文( Assembly.LoadFrom )中加载插件程序集而不是仅reflection上下文( Assembly.ReflectionOnlyLoadFrom )允许类型相等性检查评估为true ,这是我所期望的一直。 为什么仅reflection上下文导致类型不再相等? 码: 以下部分包含用于复制问题的相关代码以及已设置的项目说明。 程序集1:PluginAPI 该程序集仅包含IPlugin.cs: namespace PluginAPI { public interface IPlugin { } } 程序集2:Plugin1 该程序集包含几个插件(实现PluginAPI.IPlugin类)。 namespace Plugin1 { public class MyPlugin : IPlugin { public MyPlugin() { } } } […]

如何将对象转换为传递给函数的类型?

这不会编译,但我想要做的只是将对象转换为传递给函数的’t’? public void My_Func(Object input, Type t) { (t)object ab = TypeDescriptor.GetConverter(t).ConvertFromString(input.ToString()); }

使用Mono.Cecil替换对类型/命名空间的引用

背景(不必要,令人困惑,只为好奇) 我正在使用Unity3D for Mobile的免费版本,它不允许我在移动设备上使用System.Net.Sockets命名空间。 问题是我正在使用引用System.Net.Sockets已编译的.dll库(即IKVM)。 我实际上并没有使用引用System.Net.Sockets IKVM中的类,因此我没有购买3000美元的Unity Pro移动许可证,而是创建了一个名为dudeprgm.Net.Sockets的Sockets命名空间的存根库, dudeprgm.Net.Sockets替换了所有存根的类和方法(我使用Mono源代码完成此操作)。 我的问题 我需要将dll中的所有System.Net.Sockets.*引用替换为dudeprgm.Net.Sockets.* 。 我知道这样的事情是可能的并且由其他人完成 (参见下面的编辑 ,在页面底部) 。 我想知道自己该怎么做。 我能够使用Mono.Cecil提出以下代码。 它遍历所有IL指令,检查操作数是否为InlineType ,然后检查内联类型是否是System.Net.Sockets一部分,然后将其重命名为dudeprgm.Net.Sockets并写入。 **我不确定这是否是在Mono.Cecil中进行“查找和替换”的正确方法。 问题是,这并没有捕获所有Sockets使用(见下文)。 private static AssemblyDefinition stubsAssembly; static void Main(string[] args) { AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(args[0]); stubsAssembly = AssemblyDefinition.ReadAssembly(“Socket Stubs.dll”); // … // Call ProcessSockets on everything // … asm.Write(args[1]); } /* * This will be […]