Tag: 类型转换

在C#中将位从ulong复制到long

所以看起来.NET性能计数器类型有一个恼人的问题:它暴露了计数器RawValue的long ,而windows中的实际性能计数器值是无符号的,不能是负数。 例如,如果你有一个NumberOfItems64计数器API将非常乐意接受一个负值,然后静默地将其转换为一个非常大的数字。 实际上,对于计数器的值范围的一半,设置它的唯一方法是找到正确的负值传递! 我假设这里发生的事情是他们从long整数中获取原始位并将其视为无符号的64位数。 来自二进制补码的负值只是作为计数器的直接数字读取。 所以我试图弄清楚如何强制C#只是将ulong的位直接丢弃到long ,因为这就是API想要的。 但是C#在这里太有用了……你不能转换或使用Convert.ToInt64(ulong)因为它会因为值太大而抛出溢出exception。 我偶然发现了这种转换方式: Convert.ToInt64(myULong.ToString(“X”), 16) 当它从非基数10中的字符串转换时,它假定数字是二进制补码并且做我需要的数字。 但它并不理想,因为它需要为每次转换分配一个对象并解析一个字符串,这个API将对性能至关重要。 在C#中有更好的方法吗?

检查Delphi DLL在C#中使用的安全性

我有一个DLL,负责一些特殊的玻璃效果的自定义绘图。 我把它放在一个DLL中有三个原因: 1)因此它可以很容易地重复使用和分发,当然不会权衡它的主机应用程序, 2)所以我可以将它分发给开发人员,而他们不知道它是如何工作的, 3)因此它可以从C#中使用。 它目前在Delphi中工作,但我知道我需要做很多改动才能使它支持C#。 例如,主DLL函数包含1个参数(一个Record),其中包含许多我知道在C#中不起作用的类型(如String,也许是TColor)。 项目尚未完成100%,但正在运作。 我需要有人指出实现这一目标的最简单方法。 代码太大了,不能在这里发布,所以这里是在Pastebin 。 这是我需要知道的: 我应该像我一样继续使用唱片,还是使用像Packed Record这样的其他东西? 在这些记录中使用除String或PChar之外的其他东西的任何技巧? 我如何在C#中包装此DLL? (顺便说一句,我知道C#很少) 如何定义等效记录传递给DLL函数? 如何在C#中定义等效常量? (JD#ClassCommon.pas的C#版本) 如何获取要发送到DLL的canvas句柄(HDC)和父句柄(HWND)? 什么相当于TColor? 在记录中传递TColor等类型是否安全? 您是否预见到我的代码中的任何其他问题? 文件列表: 库:JDGlassLib.dll * 单位:JDGlassCommon.pas * 包:JDLib.bpl 单位:JDGlassCommon.pas * 单位:JDGlass.pas * 程序:JDLibTestApplicationD7.exe 表格:JDLibTestAppD7.dfm * 单位:JDLibTestAppD7.pas * ( * =代码包含在上面的链接中 ) ( JDGlassCommon.pas在DLL和Component中共享 ) 应该看起来像这样: 注意:我不是要求重写,尽管你非常欢迎。 我只需要一些如何解决这个问题的技巧。 PS:原始玻璃绘图代码记入StackOverflow的“NGLN”,回答我的先前问题: delphi定制绘图 – 发光玻璃

十进制到ASCII转换

我怎么能将十进制值转换为AScii,我已经尝试过 var charStrs = Convert.ToString(receivedEvent.tagData.can_Msg.data[3]) + Convert.ToString(receivedEvent.tagData.can_Msg.data[4]) + Convert.ToString(receivedEvent.tagData.can_Msg.data[5]) + Convert.ToString(receivedEvent.tagData.can_Msg.data[6]) + Convert.ToString(receivedEvent.tagData.can_Msg.data[7]); var asStr = String.Concat(charStrs.Select(cs => (char)Int32.Parse(cs, NumberStyles.HexNumber))); 我知道我的十进制数= 56 49 50 48 48 48 53 56 50 56并且当它转换为ascii时我将得到8120005828;但是我在NumberStyles.HexNumber中得到错误它似乎在wpf上不起作用?

如何将表达式从类型接口转换为特定类型

在我的界面中,我有以下定义 List GetListOfFoo(Expression<Func> predicate) where T : IFoo; 在我的实现中,我将以特定类型转换表达式: if (typeof(T) == typeof(Foo)) { Expression converted = Expression.Convert(predicate.Body, typeof(Foo)); Expression<Func> newPredicate = Expression.Lambda<Func>(converted, predicate.Parameters); } 我尝试使用这样的实现: Expression<Func> predicate = c => c.Name == “Myname”; _repository.GetListOfFoo(predicate); 我没有编译错误,但是如果我使用它,我会得到一个exception,即ExpressionBody中定义的bool参数。 我的问题在哪里?

当它不是静态时,如何使用现有方法而不是lambda?

这必须是重复但我还没有找到它。 我发现这个问题是相关的,因为它回答了为什么建议使用方法组而不是lambda。 但是,如果方法不在当前类中且方法不是static我如何使用现有方法组而不是lambda? 假设我有一个我希望转换为字符串的整数列表,我可以使用List.ConvertAll ,但我需要将Converter传递给它: List ints = new List { 1 }; List strings = ints.ConvertAll(i => i.ToString()); 这有效,但它使用lambda创建了一个不必要的匿名方法。 因此,如果Int32.ToString是静态的并且将采用int我可以写: List strings = ints.ConvertAll(Int32.ToString); 但那当然不能编译。 那么我怎么能使用方法组呢? 如果我要创建这样的实例方法 string FooInt(int foo) { return foo.ToString(); } 我可以使用strings = ints.ConvertAll(FooInt); ,但这不是我想要的。 我不想创建一个新方法只是为了能够使用现有的方法。

如何在不添加额外数字的情况下将float转换为double?

我遇到了一个有趣的问题:当我将float值-99.9f转换为double变量时,该变量的值为-99.9000015258789因此,此unit testing失败: float f = -99.9f; double d = (double)f; Assert.AreEqual(-99.9, d); 我知道在不同的地方添加了额外的32位。 然而,我所追求的值, -99.9000000000000 ,如果我直接指定它就表示为双-99.9000000000000 ,如unit testing所示: double d2 = -99.9; Assert.AreEqual(-99.9, d2); Assert.AreEqual(-99.9000000000000, d2); 所以我的最终问题是:是否可以采用-99.9f并将其转换为double -99.9000000000000 ,使其真正等于-99.9000000000000 ? 编辑 我找到了一种解决方法,目前看来,对于我的特定应用程序似乎很有效(即我不知道提前将浮点数舍入到精确数位的数字): float f = -99.9f; double d = double.Parse(f.ToString(“r”)); Assert.AreEqual(-99.9, d); 我不确定这是否适用于所有情况; 欢迎评论 编辑2根据Lasse V. Karlsen的回答,解决方案是使用等效于AreEqual方法的MSTest: Assert.AreEqual(-99.9, d, 0.00001); 请注意,如果我要向该delta值添加一个零,则测试将失败

Linq to SQL Int16在SQL命令中转换为Int32

使用方法参数 Int16? id 而Linq to SQL where子句 where !id.HasValue || m.Id == id 生成的数据上下文中的条件的命令文本是 来自可视化器: SELECT [t0].[Id], [t0].[Name], [t0].[IsActive] FROM [Model] AS [t0] WHERE (CONVERT(Int,[t0].[Id])) = @p0 ——————————- @p0 [Int32]: 5 我的映射类将Id作为Int16,数据库本身的列类型为smallint,那么为什么幕后的sql认为参数是整数(Int32)而不是smallint(Int16)? 列映射: [Column(IsPrimaryKey = true, DbType=”SmallInt NOT NULL”, CanBeNull=false)] public Int16 Id { get; set; }

C#类型转换:显式转换存在但引发转换错误?

我了解到HashSet实现了IEnumerable接口。 因此,可以将HashSet对象隐式转换为IEnumerable : HashSet foo = new HashSet(); IEnumerable foo2 = foo; // Implicit cast, everything fine. 这也适用于嵌套generics类型: HashSet<HashSet> dong = new HashSet<HashSet>(); IEnumerable<IEnumerable> dong2 = dong; // Implicit cast, everything fine. 至少这就是我的想法。 但如果我创建一个Dictionary ,我会遇到一个问题: IDictionary<T, HashSet> bar = new Dictionary<T, HashSet>(); IDictionary<T, IEnumerable> bar2 = bar; // compile error 最后一行给出了以下编译错误(Visual Studio 2015): 无法隐式转换类型 System.Collections.Generic.IDictionary<T, […]

该对象是整数类型。 我可以用少于五行代码获得它的价值吗?

我有一个数据阅读器。 我想比较它的值和值42.我知道它是一个整数类型(例如,MySQL调用INT , TINYINT , SMALLINT , MEDIUMINT , BIGINT , JUMBODELUXEINT等)。 我不想将实际类型硬连接到C#代码。 我想出的最好的是 object x = reader.GetValue(i); uint k = x is byte ? (byte) x : x is short ? (uint) (short) x : x is ushort ? (ushort) x : x is int ? (int) (int) x : (uint) x; if (k […]

将字符串转换为T

我有一个方法需要将字符串转换为generics类型: T GetValue(string name) { string item = getstuff(name); return item converted to T // ???????? } T可以是int或date。