web-dev-qa-db-ja.com

C#でパラメーターとして型のみを渡す

仮説的には、これを行うと便利です。

foo.GetColumnValues(dm.mainColumn, int)
foo.GetColumnValues(dm.mainColumn, string)

getColumnsメソッドは、渡された型に応じて内部で異なるメソッドを呼び出します。

はい、ブール値のフラグなどとしてそれを行うことができます。これを渡す方法があるかどうか疑問に思って、次に尋ねます:

typeof(arg [1])または同様の...

メソッドをオーバーライドしたり、ジェネリックを使用したりすることもできます-これを行うにはさまざまな方法があることを知っていますが、これが可能かどうか興味がありました

102
Mark Mayo

2つの一般的なアプローチがあります。まず、System.Typeを渡すことができます

object GetColumnValue(string columnName, Type type)
{
    // Here, you can check specific types, as needed:

    if (type == typeof(int)) { // ...

これは次のように呼び出されます:int val = (int)GetColumnValue(columnName, typeof(int));

他のオプションはジェネリックを使用することです:

T GetColumnValue<T>(string columnName)
{
    // If you need the type, you can use typeof(T)...

これには、ボクシングを回避し、型の安全性を提供するという利点があり、次のように呼び出されます:int val = GetColumnValue<int>(columnName);

171
Reed Copsey

foo.GetColumnValues(dm.mainColumn, typeof(string))

または、一般的な方法を使用することもできます。

public void GetColumnValues<T>(object mainColumn)
{
    GetColumnValues(mainColumn, typeof(T));
}

そして、次のように使用できます:

foo.GetColumnValues<string>(dm.mainColumn);
16
Peter Ritchie

引数として型を渡すことができますが、そうするにはtypeofを使用する必要があります。

foo.GetColumnValues(dm.mainColumn, typeof(int))

メソッドは、タイプTypeのパラメーターを受け入れる必要があります。


getColumnsメソッドは、渡された型に応じて内部で異なるメソッドを呼び出します。

この動作が必要な場合は、型を引数として渡すのではなく、代わりに型パラメーターを使用する必要があります。

foo.GetColumnValues<int>(dm.mainColumn)
11
Mark Byers
foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));

またはジェネリックを使用:

foo.GetColumnValues<int>(dm.mainColumn);
foo.GetColumnValues<string>(dm.mainColumn);
8
Danny Varod

これを行うことができます、それをtypeof()でラップするだけです

foo.GetColumnValues(typeof(int))

public void GetColumnValues(Type type)
{
    //logic
}
1
Kevin DiTraglia

タイプTypeの引数を使用できます-iow、typeof(int)を渡します。 (おそらくより効率的な)アプローチにジェネリックを使用することもできます。

ジェネリック型を使用してください!

  class DataExtraction<T>
{
    DateRangeReport dateRange;
    List<Predicate> predicates;
    List<string> cids;

    public DataExtraction( DateRangeReport dateRange,
                           List<Predicate> predicates,
                           List<string> cids)            

    {
        this.dateRange = dateRange;
        this.predicates = predicates;
        this.cids = cids;
    }
}

そして、このように呼び出します:

  DataExtraction<AdPerformanceRow> extractor = new DataExtraction<AdPerformanceRow>(dates, predicates , cids);
0
Boris Detry