【发布时间】:2016-10-01 16:24:49
【问题描述】:
问题: 这可以使用反射克隆类定义吗?我不是在谈论浅层克隆或深层克隆。我说的是定义克隆。我想要一个带有静态变量的类,而不是在所有实例之间共享,而只是我创建的定义。而且我(或库)需要能够在以后从这个类创建一个实例。
问题: 你看,我需要这个是因为下面的场景,
有这个库希望我为它提供具有某种静态方法的类型。但是,在我的情况下,此静态方法需要比较来自另一种类型的非静态字段的两个值。这使得无法将具有信息的实例传递给类,因为它尚未初始化。查看以下情况示例:
class MasterClass
{
public int SomeInfo {get; set;} = 10;
public void PeresentClass()
{
SOMELIBRARY.RegisterType(typeof(StaticClass));
}
}
class StaticClass
{
public static bool CanCreate(int someVar)
{
// I need to compare someVar with the SomeInfo property of MasterClass instance that presented this type to the SOMELIBRARY.
}
public StaticClass()
{
// Something irrelevant
}
}
在上面的示例中,我无法控制SOMELIBRARY 以及他们决定编写代码的方式。但是他们似乎有些想先调用CanCreate方法,然后如果满足要求,再创建一个类的实例。
但是,为了使CanCreate 正常工作,我需要首先访问将StaticClass 呈现给SOMELIBRARY 的类的实例。而且我不能将MasterClass 设为静态,因为每次都有不止一个此类的实例处于活动状态。
我能想到的唯一方法是重新定义一个新的StaticClass,其静态字段指向定义它的MasterClass(或克隆定义)。然而,我的反思知识未能让我这样做。所以我在这里问这甚至可能吗?而且我真的很希望能够在 PCL 配置文件下做到这一点。
现实世界:
只是为了了解更多信息,我实际上是在谈论XAMARIN.iOS 和NSUrlProtocol 类,特别是CanInitWithRequest 方法。
可能的解决方案:经过更多思考,我发现解决这个问题的另一种方法是使StaticClass泛型;这样做可以让我每个type 定义都有一个静态变量。但是,要使其正常工作,我需要能够在运行时创建唯一且可能为空的类型。这可能吗?
XAMARIN.iOS: 不幸的是,Reflection.Emit 在 iOS 上不可用,所以现在我不认为这是可能的。仍在等待您的cmets了解情况。
https://developer.xamarin.com/guides/ios/advanced_topics/limitations/#System.Reflection.Emit
【问题讨论】:
-
SOMELIBRARY 究竟对那个 StaticClass 做了什么?
-
@Evk:它会在创建类的新实例之前尝试调用
CanCreate方法,以查看该类是否可以处理该特定情况。 -
为什么 CanCreate 是静态方法?那是那个图书馆的要求吗?
-
@Evk,不幸的是,是的。 developer.apple.com/reference/foundation/nsurlprotocol/…
-
如果在注册 StaticClass 之前,您将当前 MasterClass 设置为某个静态变量怎么办?例如,MasterClass.Current = this; SOMELIBRARY.RegisterType(typeof(StaticClass));?
标签: c# reflection portable-class-library redefinition