如何在C#代码中知道哪种类型的变量被声明

我想有一些函数将返回“基地”如果类的可变Base传递给它,“派生”如果它被声明为Derived等不依赖于运行时类型就被分配到一个值。


例如,请参阅下面的代码。 关键是使用泛型 ,扩展方法只用于很好的语法。

using System;

static class Program
{
    public static Type GetDeclaredType<T>(this T obj)
    {
        return typeof(T);
    }

    // Demonstrate how GetDeclaredType works
    static void Main(string[] args)
    {
        ICollection iCollection = new List<string>();
        IEnumerable iEnumerable = new List<string>();
        IList<string> iList = new List<string>();
        List<string> list = null;

        Type[] types = new Type[]{
            iCollection.GetDeclaredType(),
            iEnumerable.GetDeclaredType(),
            iList.GetDeclaredType(),
            list.GetDeclaredType()
        };

        foreach (Type t in types)
            Console.WriteLine(t.Name);
    }
}

结果:

ICollection
IEnumerable
IList`1
List`1

编辑:您也可以避免在这里使用扩展方法,因为它会导致它出现在每个智能感知下拉列表中。 看另一个例子:

using System;
using System.Collections;

static class Program
{
    public static Type GetDeclaredType<T>(T obj)
    {
        return typeof(T);
    }

    static void Main(string[] args)
    {
        ICollection iCollection = new List<string>();
        IEnumerable iEnumerable = new List<string>();

        Type[] types = new Type[]{
                GetDeclaredType(iCollection),
                GetDeclaredType(iEnumerable)
        };

        foreach (Type t in types)
            Console.WriteLine(t.Name);
    }
}

也会产生正确的结果。


如果不解析相关代码,这是不可能的。

在运行时,只有两个类型的信息可用,一个值的实际类型(通过object.GetType()),如果所讨论的变量是一个参数或类/实例变量,FieldInfo上的FieldType属性,PropertyType PropertyInfo上的PropertyInfo或ParameterType。

由于传递给你的价值可能已经通过它的路线上的几个变量来到你这个问题甚至没有很好的定义我害怕。

啊 - 我看到你只需要当前在方法中定义的类型,表达式功能将提供这个(罗马的答案显示了一个干净的方式来做到这一点),但要小心试图在方法之外使用它......实质上,你正在让编译器的泛型类型推断会推断出问题的类型,但这意味着所使用的变量并不总是您可以看到的变量。 它可能是一个编译器综合变量,例如:

string x = "x";
Console.WriteLine(x.GetDeclaredType()); // string
Console.WriteLine(((object)x).GetDeclaredType()); // object

由于编译器会合成一个临时变量,在该变量中将对象引用放置到x中。


只需在GetType()上进行递归,直到碰到对象。

链接地址: http://www.djcxy.com/p/52825.html

上一篇: How to know in C# code which type a variable was declared with

下一篇: Can C++ code be valid in both C++03 and C++11 but do different things?