tags:

views:

40

answers:

3

Suppose that I have created a method like this

private void Test<t>(t str)
{

}

Now from another method i call it

private void BtnClick()
{
    string a = "";


    test<Here I Want To assign The Type what ever the type of 'a' is>();
}

How can I do this ?

+1  A: 

You simply call the function passing a as the parameter. Type inference will determine what T should be for a.

static void Main()
{
    string temp = "blah";
    Test(temp);
    Console.Read();
}

private static void Test<T>(T input)
{
    Console.WriteLine(typeof(T).ToString());
} 

System.String would be printed to the console.

Edit: But, yes, absent type inference, and when you know what your type your variable is, you can always be explicit with the type. Test<string>(temp);

Anthony Pegram
+2  A: 

Well, if a is a string, you can write:

Test<string>(a);

And if a is an int, you can write:

Test<int>(a);

Pretty obvious. If you don't know the type of a upfront, that means that BtnClick should be generic, the problem would be moved to BtnClick's caller:

private void BtnClick<T>()
{
    T a = ...;


    Test<T>(a);
}

C# 2.0 and later offers type inference, so you wouldn't have to specify the type:

Test(a);
ybo
C# 2.0 has generic type inference - it is *better* in C# 3.0, but it has been there as long as generics.
Marc Gravell
@Marc, thank you for the correction
ybo
A: 

In your example, a is always a string, so you can simply use either Test<string>(a) or Test(a). If, however, you mean that you have a Type instance hanging around somewhere, then you get into the area of reflection. Note that this works, but is slow if used in a tight-loop, so make sure that you understand the performance aspect;

        object arg = ...;
        MethodInfo method = typeof(YourType)
            .GetMethod("Test", BindingFlags.NonPublic | BindingFlags.Instance)
            .MakeGenericMethod(arg.GetType());
        method.Invoke(this, new object[] { arg });
Marc Gravell