使用字段指定泛型类型

Mat*_*hew 1 c# generics typeof datarow gettype

假设我有以下课程:

public class MyClass
{
    public decimal myDecimal;
    public string myString;
}
Run Code Online (Sandbox Code Playgroud)

我想使用DataRowExtensions方法Field <>

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

MyClass myClass = new MyClass();
myClass.myDecimal = row.Field<decimal>("MyDecimalColumnName");
myClass.myString = row.Field<string>("MyStringColumnName");
Run Code Online (Sandbox Code Playgroud)

但是,如果我决定将myDecimal的类型更改为其他类型decimal,我希望调用row.Field能够反映正确的数据.

我想要类似于以下语法的东西:

myClass.myDecimal = row.Field<typeof(myClass.myDecimal)>("MyDecimalColumnName");
Run Code Online (Sandbox Code Playgroud)

这不会编译,我不知道如何使用typeofGetType()只返回decimal,无论调用什么.

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

谢谢!

Mar*_*ell 5

首先,请注意公共领域通常是一个非常糟糕的主意; 但如果我们假设这是一个私人支持领域,那么这里有两个有趣的选择;

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

row.GetField("MyDecimalColumnName", out obj.someField);
Run Code Online (Sandbox Code Playgroud)

那是:

GetField<T>(string name, out T value);
Run Code Online (Sandbox Code Playgroud)

另一个技巧是使用隐含的运营商,即已经GetField(string)返回具有隐式转换运营商的虚拟对象的几个类型,如int,decimal等,并做好操作人员的工作/转换.有点hacky,但会工作 - 语法将是:

myClass.myDecimal = row.Field("SomeColumn")
Run Code Online (Sandbox Code Playgroud)

有:

SomeDummyType GetField(string name);
Run Code Online (Sandbox Code Playgroud)

并且SomeDummyType有一个隐式静态转换运算符或几个.

然而!IMO 这里最好的选择是使用ORM或micro-ORM等工具为您加载值,而根本不使用DataRow.

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

myClass.myDecimal = (decimal)row["SomeColumn"];
Run Code Online (Sandbox Code Playgroud)

我的意思是 - 这.Field<T>真的对你有多大帮助吗?你真的经常重构你的课程,这值得担心吗?