gpt4 book ai didi

c# - 在设计时使用类的全名查找类的类型

转载 作者:行者123 更新时间:2023-11-30 14:50:00 25 4
gpt4 key购买 nike

编辑:我正在使用 DataSourceProviderService.InvokeAddNewDataSource在 Visual Studio 设计时显示数据源配置向导的方法。如果用户选择一个对象 (as explained here),然后单击完成,我将得到一个类似于 "Namespace.ClassName" 的字符串。要在设计器中显示所选对象的属性,我需要以优化的方式找到对象的正确 Type

我有一个类的名称及其 namespace (Application.Data.Employee)。我想用这些信息找到类(class)(员工)的类型。目前我正在使用下面的代码来查找类型

string classNameWithNameSpace = "Application.Data.Employee";
Type target;
foreach(Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
foreach (Type t in assembly.GetTypes())
{
if (t.FullName.Equals(classNameWithNameSpace))
{
target = t;
break;
}
}

注意:程序集可能存在于项目中引用的任何 dll 中。我的代码还支持 .Net Framework 2.0

我知道这不是最好的方法,原因如下

1) 两个或多个程序集可能具有相同的命名空间名称和类名称

2) 我看到一个 SO 帖子说,它将为动态程序集抛出 NotSupportedException

3) 调试时发现在循环中检查不需要或不需要的程序集中的类型。 AppDomain.CurrentDomain.GetAssemblies() 方法在设计时调试期间在一个简单项目中返回 146 个程序集

4) 如果上面的代码将一个不需要的程序集加载到内存中,它将出现在内存中直到应用程序域出现(检查卸载此链接中的程序集部分 https://msdn.microsoft.com/en-us/library/mt632258.aspx )

是否有任何推荐的方法或最佳方法来做同样的事情?

最佳答案

您可以使用这些服务在设计时处理类型:

例如,您可以编写这样的方法并向它们传递合适的 IServiceProvider 以获取这些服务:

Type GetTypeByName(IServiceProvider provider, string typeName)
{
var svc= (ITypeResolutionService)provider.GetService(typeof(ITypeResolutionService));
return svc.GetType(typeName);
}
private List<Type> GetAllTypes(IServiceProvider provider)
{
var svc= (ITypeDiscoveryService)provider.GetService(typeof(ITypeDiscoveryService));
return svc.GetTypes(typeof(object), true).Cast<Type>().ToList();
}

我在 TypeConverterUiTypeEditorT4 模板和附加组件中使用了这些机制。这与 visual studio 在设计时用于处理类型的方式相同。


这是获取属性所需的确切代码:

var svc = ((DataSourceProviderService)Site.GetService(typeof(DataSourceProviderService)));
if (svc != null)
{
var result = svc.InvokeAddNewDataSource(this, FormStartPosition.CenterScreen);
if(result!=null && result.DataSources.Count>0)
{
var type = GetTypeByName(this.Site, result.DataSources[0].TypeName);
var properties = type.GetProperties().ToList();
MessageBox.Show(string.Join(",", properties.Select(x => x.Name)));
}
}

关于c# - 在设计时使用类的全名查找类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37807180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com