- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在使用 Assembly.LoadFrom 加载到当前 AppDomain 的程序集中,我有以下代码:
[TypeConverter(typeof(EnumConverter<Shapes>))]
public enum Shapes
{
Triangle,
Square,
Circle
}
通用 EnumConverter
MyAssembly.EnumConverter`1[[MyDynamicAssembly.Shapes, MyDynamicAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
但是,当我对字符串调用 Type.GetType() 时,它返回 null。我希望能够获得 System.Type 的实例。另请注意,MyDynamicAssembly 不是由 Reflection.Emit 生成的(在 MSDN 文章 here 中指出)。
此代码是在 Visual Studio 2005 上使用 .NET Framework 2.0 生成的。
有没有人找到解决此错误/限制的方法?它在 3.5 中修复了吗?
最佳答案
跟随 MSDN forum posting 的线索后,我能够整合一个通用解决方案,用于从运行时加载的程序集中加载任意泛型类型。我希望这对某些人有所帮助(也许 Microsoft 会在 .NET 4.0 中加入一些等效的东西?)
public static class TypeHelpers
{
/// <summary>
/// Gets the System.Type with the specified name, performing a case-sensitive search.
/// </summary>
/// <param name="typeName">The assembly-qualified name of the type to get. See System.Type.AssemblyQualifiedName.</param>
/// <param name="throwOnError">Whether or not to throw an exception or return null if the type was not found.</param>
/// <param name="ignoreCase">Whether or not to perform a case-insensitive search.</param>
/// <returns>The System.Type with the specified name.</returns>
/// <remarks>
/// This method can load types from dynamically loaded assemblies as long as the referenced assembly
/// has already been loaded into the current AppDomain.
/// </remarks>
public static Type GetType(string typeName, bool throwOnError, bool ignoreCase)
{
if(string.IsNullOrEmpty(typeName))
throw new ArgumentNullException("typeName");
// handle the trivial case
Type type;
if((type = Type.GetType(typeName, false, ignoreCase)) != null)
return type;
// otherwise, perform the recursive search
try
{
return GetTypeFromRecursive(typeName, ignoreCase);
}
catch(Exception e)
{
if(throwOnError)
throw;
}
return null;
}
#region Private Static Helper Methods
private static Type GetTypeFromRecursive(string typeName, bool ignoreCase)
{
int startIndex = typeName.IndexOf('[');
int endIndex = typeName.LastIndexOf(']');
if(startIndex == -1)
{
// try to load the non-generic type (e.g. System.Int32)
return TypeHelpers.GetNonGenericType(typeName, ignoreCase);
}
else
{
// determine the cardinality of the generic type
int cardinalityIndex = typeName.IndexOf('`', 0, startIndex);
string cardinalityString = typeName.Substring(cardinalityIndex + 1, startIndex - cardinalityIndex - 1);
int cardinality = int.Parse(cardinalityString);
// get the FullName of the non-generic type (e.g. System.Collections.Generic.List`1)
string fullName = typeName.Substring(0, startIndex);
if(typeName.Length - endIndex - 1 > 0)
fullName += typeName.Substring(endIndex + 1, typeName.Length - endIndex - 1);
// parse the child type arguments for this generic type (recursive)
List<Type> list = new List<Type>();
string typeArguments = typeName.Substring(startIndex + 1, endIndex - startIndex - 1);
foreach(string item in EachAssemblyQualifiedName(typeArguments, cardinality))
{
Type typeArgument = GetTypeFromRecursive(item, ignoreCase);
list.Add(typeArgument);
}
// construct the generic type definition
return TypeHelpers.GetNonGenericType(fullName, ignoreCase).MakeGenericType(list.ToArray());
}
}
private static IEnumerable<string> EachAssemblyQualifiedName(string s, int count)
{
Debug.Assert(count != 0);
Debug.Assert(string.IsNullOrEmpty(s) == false);
Debug.Assert(s.Length > 2);
// e.g. "[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]"
// e.g. "[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]"
// e.g. "[System.Collections.Generic.KeyValuePair`2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]"
int startIndex = 0;
int bracketCount = 0;
while(count > 0)
{
bracketCount = 0;
for(int i = startIndex; i < s.Length; i++)
{
switch(s[i])
{
case '[':
bracketCount++;
continue;
case ']':
if(--bracketCount == 0)
{
string item = s.Substring(startIndex + 1, i - startIndex - 1);
yield return item;
startIndex = i + 2;
}
break;
default:
continue;
}
}
if(bracketCount != 0)
{
const string SR_Malformed = "The brackets are unbalanced in the string, '{0}'.";
throw new FormatException(string.Format(SR_Malformed, s));
}
count--;
}
}
private static Type GetNonGenericType(string typeName, bool ignoreCase)
{
// assume the type information is not a dynamically loaded assembly
Type type = Type.GetType(typeName, false, ignoreCase);
if(type != null)
return type;
// otherwise, search the assemblies in the current AppDomain for the type
int assemblyFullNameIndex = typeName.IndexOf(',');
if(assemblyFullNameIndex != -1)
{
string assemblyFullName = typeName.Substring(assemblyFullNameIndex + 2, typeName.Length - assemblyFullNameIndex - 2);
foreach(Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if(assembly.GetName().FullName == assemblyFullName)
{
string fullName = typeName.Substring(0, assemblyFullNameIndex);
type = assembly.GetType(fullName, false, ignoreCase);
if(type != null)
return type;
}
}
}
// no luck? blow up
const string SR_TypeNotFound = "The type, '{0}', was not found.";
throw new ArgumentException(string.Format(SR_TypeNotFound, typeName), "typeName");
}
#endregion
}
此代码已通过上述场景和以下 MbUnit 测试进行了测试:
[Test]
public void GetType_DictionaryOfStringAndDictionaryOfInt32AndKeyValuePairOfStringAndListOfInt32()
{
Dictionary<string, Dictionary<int, KeyValuePair<string, List<int>>>> obj =
new Dictionary<string, Dictionary<int, KeyValuePair<string, List<int>>>>();
string typeName = obj.GetType().FullName;
Type type = TypeHelpers.GetType(typeName, true, false);
Assert.IsTrue(type.Equals(obj.GetType()));
}
注意:尝试使用此测试时应注释掉琐碎的处理程序,否则将调用 Type.GetType() 而不是实际的解析代码。
关于c# - 如何从动态加载的程序集中加载包含嵌套类型的泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/660607/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!