【问题标题】:Reflection API missing in Portable Class Library Profile259可移植类库 Profile259 中缺少反射 API
【发布时间】:2015-07-06 01:45:04
【问题描述】:

我的以下代码在 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。

我现在该怎么办?

【问题讨论】:

标签: c# reflection mvvmcross portable-class-library


【解决方案1】:

感谢 Stuart 的提示。我需要做的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;
        }
    }

这里违反了一些法律,但是.....

希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多