Reputation: 12585
Hypothetically it'd be handy for me to do this:
foo.GetColumnValues(dm.mainColumn, int)
foo.GetColumnValues(dm.mainColumn, string)
where the GetColumns method will call a different method inside depending on the type passed.
Yes, I could do it as a boolean flag or similar, I just wondered if there was a way to perhaps pass this, and then ask:
typeof(arg[1]) or similar...
I could also override the method, use generics, etc - I know there are different ways to do this, I was just curious if this was possible.
Upvotes: 175
Views: 305707
Reputation: 1814
Use generic types !
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;
}
}
And call it like this :
DataExtraction<AdPerformanceRow> extractor = new DataExtraction<AdPerformanceRow>(dates, predicates , cids);
Upvotes: 0
Reputation: 837906
You can pass a type as an argument, but to do so you must use typeof
:
foo.GetColumnValues(dm.mainColumn, typeof(int))
The method would need to accept a parameter with type Type
.
where the GetColumns method will call a different method inside depending on the type passed.
If you want this behaviour then you should not pass the type as an argument but instead use a type parameter.
foo.GetColumnValues<int>(dm.mainColumn)
Upvotes: 17
Reputation: 18069
foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));
Or using generics:
foo.GetColumnValues<int>(dm.mainColumn);
foo.GetColumnValues<string>(dm.mainColumn);
Upvotes: 8
Reputation: 564323
There are two common approaches. First, you can pass System.Type
object GetColumnValue(string columnName, Type type)
{
// Here, you can check specific types, as needed:
if (type == typeof(int)) { // ...
This would be called like: int val = (int)GetColumnValue(columnName, typeof(int));
The other option would be to use generics:
T GetColumnValue<T>(string columnName)
{
// If you need the type, you can use typeof(T)...
This has the advantage of avoiding the boxing and providing some type safety, and would be called like: int val = GetColumnValue<int>(columnName);
Upvotes: 277
Reputation: 28829
You can use an argument of type Type - iow, pass typeof(int). You can also use generics for a (probably more efficient) approach.
Upvotes: 0
Reputation: 26048
You can do this, just wrap it in typeof()
foo.GetColumnValues(typeof(int))
public void GetColumnValues(Type type)
{
//logic
}
Upvotes: 2
Reputation: 35881
foo.GetColumnValues(dm.mainColumn, typeof(string))
Alternatively, you could use a generic method:
public void GetColumnValues<T>(object mainColumn)
{
GetColumnValues(mainColumn, typeof(T));
}
and you could then use it like:
foo.GetColumnValues<string>(dm.mainColumn);
Upvotes: 30