Con*_*ark 12 c# reflection namespaces
有没有办法得到一个List<string>包含命名空间/类中所有'使用'的东西?
例如
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
{
Run Code Online (Sandbox Code Playgroud)
我会有一个带有"System","System.Text","System.Reflection"等的List.
编辑:如下所示,我正在使用这个http://kamimucode.com/Home.aspx/C-sharp-Eval/1 - C#评估器,我必须为TypeParser提供一个命名空间列表.问题是,我不会总是知道要放哪些.我正在使用C#中的一种简单的脚本语言,从中我将能够调用C#代码.我的另一种选择是在脚本语言中创建一个关键字,例如"using",但我真的不想这样做.我希望能够选择一个C#对象,通过我的script.txt做任何我想做的事情,并且可以自由地使用它引用的命名空间.
我想在我的Xna Game引擎中使用它,能够编写可以执行C#的自定义脚本以及我的简单脚本函数.
这将适用于声明类的方法中的所有类型,但它不会为编译之前的文件中的所有类提供所有名称空间.这是不可能的,因为在编译之后,框架无法知道文件中的位置.
因此,如果你有一个CLASS每个文件,这将工作:如果你遗漏了一些东西(我寻找字段和方法,也许没有考虑到某些事情,如果只是添加)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我案例的示例输出:
System
System.Collections.Generic
System.Reflection
WindowsFormsApplication2
System.Linq.Expressions
Run Code Online (Sandbox Code Playgroud)