有没有一种方法可以让您';re';使用';通过C#代码在一个类中?

有没有一种方法可以让您';re';使用';通过C#代码在一个类中?,c#,reflection,namespaces,C#,Reflection,Namespaces,有没有办法获得一个列表,其中包含命名空间/类中的所有“using” 比如说 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; using System.Linq.Dynamic; using System.Text.RegularExpressions; using System.Reflection; names

有没有办法获得一个
列表
,其中包含命名空间/类中的所有“using”

比如说

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
using System.Linq.Dynamic;
using System.Text.RegularExpressions;
using System.Reflection;
namespace MyNamespace.Other.Scripting
{
我会有一个列表,上面有“系统”、“系统.文本”、“系统.反射”等等

编辑:如下所示:, 我正在使用这个-C#evaluator,我必须向TypeParser提供一个名称空间列表。问题是,我并不总是知道该放哪一个。我正在用C语言编写一种简单的脚本语言,通过它我也可以调用C代码。我的另一个选择是在脚本语言中创建一个关键字,比如“using”,但我真的不想这样做。我希望能够选择一个C#对象,通过script.txt对其执行任何操作,并自由使用其引用的名称空间


我想在我的Xna游戏引擎中使用它,以便能够编写自定义脚本,与我的简单脚本函数一起执行C。\

IEnumerable<string> GetNamespacesUsed(string fileName)
{
    var lines = System.IO.File.ReadAllLines(fileName);
    var usingLines = lines.Where(
        x => x.StartsWith("using ") && !x.StartsWith("using ("));

    foreach (var line in usingLines)
    {
        if (line.Contains("="))
            yield return line.Substring(line.IndexOf("="), line.Length - 1);
        else
            yield return line.Substring(line.Length - 1);
    }
}
IEnumerable GetNamespacesUsed(字符串文件名)
{
var lines=System.IO.File.ReadAllLines(文件名);
var usingLines=行。其中(
x=>x.StartsWith(“使用”)和&!x.StartsWith(“使用”);
foreach(usingLines中的var行)
{
如果(第行包含(“=”)
收益率返回行。子字符串(行。IndexOf(“=”),行。长度-1);
其他的
收益率返回线子串(线长度-1);
}
}

line.Length-1
可能不正确,无法在结尾处截断分号。您需要对其进行测试,以确定它应该是什么。此外,这假设您的代码以相当标准的方式进行了格式化。如果不是这样,它将不起作用。

您可以使用从程序集读取类定义并获取所有引用类型的列表从那里,您可以提取名称空间列表(完全限定类型名减去最后一部分).

这将适用于声明类的方法中的所有类型,但是它不会在编译之前为文件中的所有类提供所有名称空间。这是不可能的,因为编译之后框架无法知道文件中的内容

因此,如果每个文件有一个类,则可以: 如果您缺少某些内容(我查找字段和方法,可能有些内容没有考虑在内,如果是这样,请添加)


您想将其用于源文件(即:从磁盘读取的实际.cs文件)吗或者你想知道一个给定的编译类型实际上引用了哪些名称空间?我猜是后者,因为你提到了反射,但是你能确认一下吗?“一个给定的编译类型引用了哪些名称空间”将是我的选择吗?我猜不是在这个问题上,因为使用实际上只是编译器在非限定类型上的简写s、 我会检查一下。顺便说一句,为什么?除非你想应用一些标准,否则我不确定我能在应用程序中看到这种直接的需求。如果是这样,你可以创建自定义的StyleCop程序集来分析它们?@Conrad:这当然是可行的,但这与使用可能已经或可能没有被使用的指令无关出现在原始代码文件中。可以吗?另外,我和James一样想知道您想要对结果做什么(部分原因是它会影响实现选择)。很抱歉,这个问题有误导性,我指的是类中使用的名称空间,而不是文件。我无权访问这些文件。您需要名称空间或其他引用的程序集吗?后者可以通过
Assembly.getReferenceAssemblys()获得
;看看你是否真的是指名称空间,那么我认为你不能这样做。据我回忆,在IL中,名称是完全限定的。没有使用
语句的
Assembly.getReferenceAssemblys()
对我不起作用。我想我必须坚持根据脚本手动设置环境。非常感谢。这部分解决了我的问题,但已经足够了。我刚刚测试了通过脚本将各种对象添加到
堆栈中,效果非常好。
List<string> namespaces = new List<string>();

        var m = MethodInfo.GetCurrentMethod();

            foreach (var mb in m.DeclaringType.GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic))
            {
                if (mb.MemberType == MemberTypes.Method && ((MethodBase)mb).GetMethodBody() != null)
                {

                    foreach (var p in ((MethodInfo)mb).GetMethodBody().LocalVariables)
                    {
                        if (!namespaces.Contains(p.LocalType.Namespace))
                        {
                            namespaces.Add(p.LocalType.Namespace);
                            Console.WriteLine(p.LocalType.Namespace);
                        }
                    }
                }
                else if (mb.MemberType == MemberTypes.Field) {
                    string ns = ((System.Reflection.FieldInfo)mb).FieldType.Namespace;
                    if (!namespaces.Contains(ns))
                    {                        
                        namespaces.Add(ns);
                        Console.WriteLine(ns);
                    }
                }
            }
System
System.Collections.Generic
System.Reflection
WindowsFormsApplication2
System.Linq.Expressions