c# - 使用字段指定泛型类型

标签 c# generics datarow typeof gettype

假设我有以下类(class):

public class MyClass
{
    public decimal myDecimal;
    public string myString;
}

我想使用 DataRowExtensions 方法 Field<>

目前,我正在使用这样的类:

MyClass myClass = new MyClass();
myClass.myDecimal = row.Field<decimal>("MyDecimalColumnName");
myClass.myString = row.Field<string>("MyStringColumnName");

但是,如果我决定将 myDecimal 的类型更改为 decimal 以外的类型,我希望调用 row.Field 以反射(reflect)正确的数据。

我想要类似于以下语法的内容:

myClass.myDecimal = row.Field<typeof(myClass.myDecimal)>("MyDecimalColumnName");

这不会编译,而且我不知道如何使用 typeofGetType() 来返回 decimal,无论如何会被调用。

有没有办法做到这一点,或类似的东西?我认为这可以在编译时完成,因为类型是已知的,而且泛型是编译时构造的。

谢谢!

最佳答案

首先,请注意公共(public)字段通常是一个非常糟糕的主意;但如果我们假设这是一个私有(private)支持领域,这里有 2 个有趣的选择;

首先是利用泛型类型推断;这不适用于 return 类型,但适用于参数,因此您可以:

row.GetField("MyDecimalColumnName", out obj.someField);

那是哪里:

GetField<T>(string name, out T value);

另一个技巧是使用隐式运算符,即 GetField(string)返回一个虚拟对象,该对象具有隐式转换运算符到几种类型,例如 int , decimal等,并在运算符中进行工作/转换。有点 hacky,但会工作 - 语法是:

myClass.myDecimal = row.Field("SomeColumn")

与:

SomeDummyType GetField(string name);

SomeDummyType具有一个或多个隐式静态转换运算符。

但是! IMO 此处的最佳选项是使用 ORM 或微型 ORM 等工具为您加载值,并且不要使用 DataRow完全没有。

另一个简单的选择就是老派:

myClass.myDecimal = (decimal)row["SomeColumn"];

我的意思是 - 是 .Field<T>真的帮了你们那么大忙吗?您是否真的经常重构您的类,以至于值得为此担心?

关于c# - 使用字段指定泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9685982/

相关文章:

c# - 如何设置 SwashBuckle.AspNetCore.Swagger 以使用授权?

c# - "Bad Data"使用 RSACryptoProvider 从在 PHP 中加密的字符串解密时

c# - 覆盖方法是否被视为虚拟方法?

c# - 通用局部 View : how to set a generic class as model?

java - 从泛型函数返回泛型类型

c# - 如何检查数据行值是否为空

c# - 数据集中特定列的所有行

c# - XPath 仅返回特定的子节点但与父节点一起返回 - 可能吗?

swift - 如何从通用函数返回值作为协议(protocol)的实现?

c# - 遍历数据网格的行