C #에서 매개 변수로 형식 만 전달


130

가정적으로이 작업을 수행하는 것이 편리 할 것입니다.

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

여기서 GetColumns 메서드는 전달 된 형식에 따라 내부에서 다른 메서드를 호출합니다.

예, 부울 플래그 또는 이와 유사한 것으로 할 수 있습니다. 아마도 이것을 전달할 방법이 있는지 궁금한 다음 묻습니다.

typeof (arg [1]) 또는 유사 ...

메서드를 재정의하고 제네릭을 사용할 수도 있습니다.이 작업을 수행하는 다른 방법이 있다는 것을 알고 있습니다. 이것이 가능한지 궁금했습니다.


foo가 실제로 무엇인지에 따라 정확히 내 생각. foo.GetColumnValues<int>(dm.mainColumn)갈 길이 될 수 있습니다.
Major Productions

1
내가 말했듯이이 작업을 수행하는 다른 방법 (부울 플래그, 제네릭, 메서드 재정의)이 있다는 것을 알고 있습니다. 매개 변수로 가능한지 궁금했습니다.
Mark Mayo

@MarkMayo : "메소드를 재정의하고 제네릭을 사용할 수도 있다는 것을 알고 있고이를 수행하는 다른 방법이 있다는 것을 알고 있다면 이것이 가능했는지 궁금 합니다 "라는 질문을 이해하지 못합니다 . 그래서 당신은이 모든 것을 알고 있지만 가능한지 궁금합니다 ??
Tim Schmelter 2012-06-08

@TimSchmelter-내가 설명하는 형식. 즉, 두 번째 매개 변수로 전달합니다. 그것이 밝혀 졌을 때, Reed는 당신이 사용하는 곳 (..., 유형 유형)-내가 추구했던 것을 약간 말했습니다. 그게 제가 찾던 것입니다.
Mark Mayo

1
좋은 질문입니다. 저는 MS가 VB.NET의 내장 연산자 (예 : trycast)에 대한 매개 변수로 Type을 사용하는 것을보고 종종 C # / VB에서 직접 설명 할 수 있기를 바랐습니다.
Chalky

답변:


213

두 가지 일반적인 접근 방식이 있습니다. 먼저 통과 할 수 있습니다.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

그러나 여러 인수가 있고 그중 하나가 제네릭이어야하는 메서드를 어떻게 정의합니까? 제네릭이 메소드 인수 목록 앞에 정의되었으므로 어떤 것이 제네릭이어야하는지 어떻게 알 수 있습니까?
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.


여기서 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에 대한 간단한 읽기만으로 충분합니다. 나는 하향 투표자가 rep과 경쟁하는 응답자라고 생각합니다.
Danny Varod 2012-06-08


0

Type-iow, pass 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.