便携式 Class 库配置文件中缺少反射 API259
Reflection API missing in Portable Class Library Profile259
我在 TargetFrameworkVersion 为 4.0 和 TargetFrameworkProfile 为 Profile104 的 PCL 中运行良好的以下代码。
public class AppCapabilitiesRepository : IAppCapabilityRepository
{
private readonly Type _typeOfAppCapability = typeof (IAppCapability);
public IList<IAppCapability> GetCapabilities()
{
var capabilities = Assembly.GetExecutingAssembly().GetTypes().Where(IsAppCapability).ToArray();
var viewModels = capabilities.Select(capability => ((IAppCapability)Activator.CreateInstance(capability)))
.Where(c => c.IsActive)
.OrderBy(c => c.Popularity).ToList();
return viewModels;
}
private bool IsAppCapability(Type type)
{
return _typeOfAppCapability.IsAssignableFrom(type) && !type.IsAbstract && !type.IsInterface;
}
}
项目升级到4.5的TargetFrameworkVersion和Profile259的TargetFrameworkProfile后,这些反射API已经找不到了:
Assembly.GetExecutingAssembly、Type.IsAbstract 和 Type.IsInterface.
如果这很重要,此解决方案也使用 MvvmCross 3.5.1。
我现在该怎么办?
感谢斯图尔特的提示。 API 我需要做的改动如下:
Assembly.GetExecutingAssembly => this.GetType().GetTypeInfo().Assembly
Type.IsAbstract => TypeInfo.IsAbstract where TypeInfo.GetTypeInfo()
Type.IsInterface => TypeInfo.IsInterface where TypeInfo = Type.GetTypeInfo()
修改后的代码如下:
public class AppCapabilitiesRepository : IAppCapabilityRepository
{
private readonly Type _typeOfAppCapability = typeof (IAppCapability);
public IList<IAppCapability> GetCapabilities()
{
var capabilities = GetType().GetTypeInfo().Assembly.GetTypes().Where(IsAppCapability).ToArray();
var viewModels = capabilities.Select(capability => ((IAppCapability)Activator.CreateInstance(capability)))
.Where(c => c.IsActive)
.OrderBy(c => c.Popularity).ToList();
return viewModels;
}
private bool IsAppCapability(Type type)
{
var typeInfo = type.GetTypeInfo();
return _typeOfAppCapability.IsAssignableFrom(type) && !typeInfo.IsAbstract && !typeInfo.IsInterface;
}
}
这里违反了一些法律,但是......
希望这对其他人有帮助。
我在 TargetFrameworkVersion 为 4.0 和 TargetFrameworkProfile 为 Profile104 的 PCL 中运行良好的以下代码。
public class AppCapabilitiesRepository : IAppCapabilityRepository
{
private readonly Type _typeOfAppCapability = typeof (IAppCapability);
public IList<IAppCapability> GetCapabilities()
{
var capabilities = Assembly.GetExecutingAssembly().GetTypes().Where(IsAppCapability).ToArray();
var viewModels = capabilities.Select(capability => ((IAppCapability)Activator.CreateInstance(capability)))
.Where(c => c.IsActive)
.OrderBy(c => c.Popularity).ToList();
return viewModels;
}
private bool IsAppCapability(Type type)
{
return _typeOfAppCapability.IsAssignableFrom(type) && !type.IsAbstract && !type.IsInterface;
}
}
项目升级到4.5的TargetFrameworkVersion和Profile259的TargetFrameworkProfile后,这些反射API已经找不到了:
Assembly.GetExecutingAssembly、Type.IsAbstract 和 Type.IsInterface.
如果这很重要,此解决方案也使用 MvvmCross 3.5.1。
我现在该怎么办?
感谢斯图尔特的提示。 API 我需要做的改动如下:
Assembly.GetExecutingAssembly => this.GetType().GetTypeInfo().Assembly
Type.IsAbstract => TypeInfo.IsAbstract where TypeInfo.GetTypeInfo()
Type.IsInterface => TypeInfo.IsInterface where TypeInfo = Type.GetTypeInfo()
修改后的代码如下:
public class AppCapabilitiesRepository : IAppCapabilityRepository
{
private readonly Type _typeOfAppCapability = typeof (IAppCapability);
public IList<IAppCapability> GetCapabilities()
{
var capabilities = GetType().GetTypeInfo().Assembly.GetTypes().Where(IsAppCapability).ToArray();
var viewModels = capabilities.Select(capability => ((IAppCapability)Activator.CreateInstance(capability)))
.Where(c => c.IsActive)
.OrderBy(c => c.Popularity).ToList();
return viewModels;
}
private bool IsAppCapability(Type type)
{
var typeInfo = type.GetTypeInfo();
return _typeOfAppCapability.IsAssignableFrom(type) && !typeInfo.IsAbstract && !typeInfo.IsInterface;
}
}
这里违反了一些法律,但是......
希望这对其他人有帮助。