簡體   English   中英

使用字段指定泛型類型

[英]Specify generics type using a field

假設我有以下課程:

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的調用反映正確的數據。

我想要類似以下語法的內容:

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

這不會編譯,而且我不知道如何使用typeofGetType()僅返回decimal ,無論調用什么。

有沒有辦法做到這一點,或者類似的方法? 我認為這可以在編譯時完成,因為類型是已知的,並且由於泛型是編譯時的構造。

謝謝!

首先,請注意,公共領域通常是一個非常糟糕的主意; 但是,如果我們假設這是一個私人支持領域,那么這里有2個有趣的選項;

首先是利用通用類型推斷。 這不適用於返回類型,但適用於參數,因此您可以:

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

在哪里:

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

另一個技巧是使用隱式運算符,即讓GetField(string)返回一個虛擬對象,該對象將隱式轉換運算符轉換為intdecimal等類型,並在該運算符中進行工作/轉換。 有點hacky,但是可以用-語法是:

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

與:

SomeDummyType GetField(string name);

並且SomeDummyType具有隱式靜態轉換運算符或多個。

然而! IMO此處最好的選擇是使用ORM或micro-ORM之類的工具為您加載值,而根本不使用DataRow

另一個簡單的選擇就是去老派:

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

我的意思是.Field<T>真的對您有很大幫助? 您是否真的經常對類進行足夠的重構以至於值得為此擔心?

您可以使用反射來動態構造適當的通用方法:

MyClass myClass = new MyClass();
var myType = typeof(MyClass.myDecimal);
var myMethod = Type.GetType("System.Data.DataRowExtensions")
   .GetMethod("Field", new[]{typeof(DataRow), typeof(string));
var genericMethod = myMethod.MakeGenericMethod(new[]{myType});

myClass.myDecimal = genericMethod.Invoke(row, new object[]{"MyDecimalColumnName"});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM