Вопрос: Можно ли клонировать определение класса с помощью отражения? Я не говорю о мелком или глубоком клонировании. Я говорю о клонировании определений. Я хочу иметь класс со статической переменной, не разделяемой между всеми экземплярами, а только созданное мной определение. И мне (или библиотеке) нужно иметь возможность создать экземпляр из этого класса позже.
Проблема: Видите ли, мне это нужно из-за следующего сценария,
Есть эта библиотека, которая ожидает, что я предоставлю ей тип, имеющий определенный статический метод. Однако в моем случае этот статический метод должен сравнить два значения, одно из нестатического поля другого типа. Это делает невозможным передачу экземпляра, содержащего информацию, в класс, поскольку он еще не инициализирован. Посмотрите на следующий пример ситуации:
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, поэтому пока я не верю, что это вообще возможно. Все еще жду ваших комментариев по ситуации.
https://developer.xamarin.com/guides/ios/advanced_topics/limitations/#System.Reflection.Emit
CanCreate
перед созданием нового экземпляра класса, чтобы узнать, может ли класс справиться с этой конкретной ситуацией. - person Soroush Falahati   schedule 01.10.2016