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


129

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

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

GetColumnsメソッドは、渡されたタイプに応じて内部で別のメソッドを呼び出します。

はい、ブールフラグまたは類似のフラグとしてそれを行うことができます。これを渡す方法があるのか​​どうか疑問に思ってから、次のように質問します。

typeof(arg [1])または類似...

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


私の考えは、fooが実際に何であるかによって異なります。 foo.GetColumnValues<int>(dm.mainColumn)行く方法かもしれません。
メジャープロダクション

1
私が言ったように、これを行うには他の方法(ブールフラグ、ジェネリックス、メソッドのオーバーライド)があることを理解しています。パラメーターとして可能かどうか疑問に思いました。
Mark Mayo

@MarkMayo:「メソッドをオーバーライドしたり、ジェネリックスを使用したりできることを知っていて、これを行うにはさまざまな方法があることを知っていて、それが可能かどうか興味があるだけなのか」という質問は理解できません。あなたはこれをすべて知っていますが、それが可能であるかどうかに興味がありますか?
Tim Schmelter

@TimSchmelter-私が説明する形で。つまり、2番目のパラメータとして渡します。結局のところ、リードは私が何を求めていたか-どこで使用するか(...、Typeタイプ)を言っています。それが私が探していたものです。
Mark Mayo

1
良い質問、賛成、MSはTypeをVB.NETの組み込み演算子のパラメーターとして使用している(例:トライキャスト)と思いますが、C#/ VBで自分ができることを望んでいます。
チョーキー2014年

回答:


213

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);


1
拡張メソッド、public static T GetColumnValue <T>(this string columnName){...}を実行して、foo.GetColumnValues <string>(dm.mainColumn)
Joshua G

しかし、いくつかの引数を持つメソッドをどのように定義し、そのうちの1つをジェネリックにする必要がありますか?ジェネリックはメソッド引数リストの前に定義されているので、どのジェネリックにする必要があるかをどのようにして知ることができますか?
BadmintonCat

5
@BadmintonCat T Foo<T,U>(string arg1, U arg2)または類似
リードCopsey

最初のアプローチを使用するときに、タイプにデフォルト値を割り当てる方法はありますか?(例えば、のようなものobject GetColumnValue(string columnName, Type type = object)?それはかなり私のために動作するようには思えないが、それは知っておくと便利でしょう。
デイブ・コール

22

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

または、ジェネリックメソッドを使用することもできます。

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

そして、あなたはそれを次のように使うことができます:

foo.GetColumnValues<string>(dm.mainColumn);

13

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

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

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


GetColumnsメソッドは、渡されたタイプに応じて内部で別のメソッドを呼び出します。

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

foo.GetColumnValues<int>(dm.mainColumn)

8
foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));

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

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

3
私はあなたをdvしませんでしたが、それはおそらくそれが呼び出される方法を示していて、関数定義を指定していなかったためでした
JConstantine

3
スプーンフィーディングが必要なときは嫌いです。答え+ MSDNのほんの短い読みで十分です。反対投票者は、担当者と競合する回答者であると思います。
ダニーVarod

1

あなたはこれを行うことができます、それを包むだけです typeof()

foo.GetColumnValues(typeof(int))

public void GetColumnValues(Type type)
{
    //logic
}

0

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


0

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

  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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.