相关疑难解决方法(0)

如何判断类型是否为"简单"类型?即持有单一价值

typeof(string).IsPrimitive == false
typeof(int).IsPrimitive == true
typeof(MyClass).IsClass == true
typeof(string).IsClass == true
typeof(string).IsByRef == false
typeof(MyClass).IsByRef == true // correction: should be false (see comments below)
Run Code Online (Sandbox Code Playgroud)

我有一个实例化T的新实例的方法,如果它是一个"复杂"类,则从一组源数据值中填充其属性.

(a)如果T是简单类型(例如字符串或int或其他类似的东西),则执行从源数据到T的快速转换.

(b)如果T是一个类(但不是像字符串这样简单的东西),那么我将使用Activator.CreateInstance并进行一些反射来填充字段.

是否有一种快速而简单的方法来判断我是否应该使用方法(a)或方法(b)?此逻辑将在通用方法中使用,其中T作为类型参数.

.net c# generics

59
推荐指数
4
解决办法
3万
查看次数

在MongoDB中序列化和反序列化结构的解决方法

在MongoDB中,struct(valuetype)序列化和反序列化是不可能的,因为MongoDB抛出一个异常:BsonClassMapSerializer.cs行:84.

但我想一般解决这个问题.

背景

我们想创建一个库,让我们称之为PolyglotPersistence.Lib.我的"客户"使用这个库将他的数据集保存到数据库中,数据库可以是MongoDB Azure CosomosDB,也可以是自己实现的MemoryDB和其他一些解决方案.

但是由于struct问题,MongoDB无法保存所有类型的数据结构.


我在Stackoverflow中已经发现了一些问题/答案,但这些解决方案并非一般解决方案.

示例1 如何使用MongoDB C#serializer序列化值类型? 这根本不是通用的,当我应用这个解决方案时,我必须为每个结构创建一个Serialize/Deserializer.没关系,可以使用通用的StructSerializer <>来完成,但"客户端"仍然需要为所有结构注册它.这是不可接受的,因为他们不知道数据将被序列化的位置(Cosmos/Mongo/Memory/etc ......).

示例2 使用Mongo C#驱动程序序列化不可变值类型 它几乎是相同的解决方案.必须通过"client"注册一个特殊的Serializer.

示例3 使用MongoDB C#驱动程序反序列化嵌套结构 它们更改为类,这对我们来说不是一个好方法.


可能的解决方案1 我们创建一个新规则:当"客户端"在他的数据结构中使用结构时,他必须从特殊的基类开始,比如说"IStruct".我们为这种类型注册了一个序列化器,问题解决了.

但对于我们的客户来说,这对我们来说是不舒服的,而不是一个防弹解决方案.

可能的解决方案2 当用户为我们的库添加一个新类型(PolyglotPersistence.Lib)时,我们必须递归地遍历此类型,并检测其中是否有结构.当我们找到它时,我们必须注册这种类型的序列化器,当它尚未注册时.

但是对于这个解决方案,我们必须找到客户端数据结构中的所有结构.

可能的解决方案3 为struct的basetype注册Serializer.我不知道它是否存在.但这将是最好的解决方案.struct的最终基类:)


所以问题是:

  1. 是否有最终构建在c#中的结构的最终基类或接口?
  2. 如果我有System.Type我怎么能检测到它是一个结构,百分百安全?

谢谢大家的回答,请不要将此问题标记为重复,因为已经回答的解决方案不适合我们的问题.请在标记之前阅读问题.谢谢

PS所有评论将不胜感激:)

c# serialization struct mongodb

9
推荐指数
1
解决办法
939
查看次数

在C#反射中获取"类型"的类型

这在文档中比我想象的更难找到.无论如何,我有一些例子Type.我怎样才能知道它们是代表类,方法,接口等?

class Bla { ... }
typeof(Bla).GetKindOrWhatever() // need to get something like "Class"

(我在Linux上使用Mono,但这不应该影响问题,我正在制作可移植的代码)

c# reflection

1
推荐指数
2
解决办法
1239
查看次数

IsClass("className")方法?

有没有办法在运行时知道类名是否是一个类?换句话说,是否有某种方法可以告诉您字符串输入是否是.NET类?

c#

1
推荐指数
1
解决办法
94
查看次数

标签 统计

c# ×4

.net ×1

generics ×1

mongodb ×1

reflection ×1

serialization ×1

struct ×1