Перефразируйте вопрос. Прокрутка вниз для оригиналаУведомление об изменении недвижимости в общем имуществе
Хорошо, возможно, я должен был дать вам всю картину. У меня есть много классов, которые выглядят следующим образом:
public class Movement : Component
{
private Vector3 linearVelocity;
public Vector3 LinearVelocity
{
get
{
return linearVelocity;
}
set
{
if (value != linearVelocity)
{
linearVelocity = value;
ComponentChangedEvent<Movement>.Invoke(this, "LinearVelocity");
}
}
}
// other properties (e.g. AngularVelocity), which are declared exactly
// the same way as above
}
Есть также классы называются Transform, Mesh, коллайдер, внешний вид и т.д. все полученные от Component
и вообще не имеют ничего, кроме свойств, которые объявлены, как описано выше. Здесь важно вызвать ComponentChangedEvent
. Все работает отлично, но я искал способ, которым я не должен переписывать одну и ту же логику для каждого свойства снова и снова.
Я посмотрел here и мне понравилась идея использования общих свойств. То, что я придумал выглядит следующим образом:
public class ComponentProperty<TValue, TOwner>
{
private TValue _value;
public TValue Value
{
get
{
return _value;
}
set
{
if (!EqualityComparer<TValue>.Default.Equals(_value, value))
{
_value = value;
ComponentChangedEvent<TOwner>.Invoke(
/*get instance of the class which declares value (e.g. Movement instance)*/,
/*get name of property where value comes from (e.g. "LinearVelocity") */);
}
}
}
public static implicit operator TValue(ComponentProperty<TValue, TOwner> value)
{
return value.Value;
}
public static implicit operator ComponentProperty<TValue, TOwner>(TValue value)
{
return new ComponentProperty<TValue, TOwner> { Value = value };
}
}
Тогда я хотел бы использовать его как это:
public class Movement : Component
{
public ComponentProperty<Vector3, Movement> LinearVelocity { get; set; }
public ComponentProperty<Vector3, Movement> AngularVelocity { get; set; }
}
Но я не в состоянии получить экземпляр, где LinearVelocity приходит от ни его имя в виде строки. Поэтому мой вопрос был, если все это возможно ...
Но, похоже, у меня нет другого варианта, кроме как продолжать делать это так, как я был, написав эту логику для каждого свойства вручную.
Оригинал Вопрос:
Получить экземпляр объявляющего класса от собственности
У меня есть класс со свойством:
public class Foo
{
public int Bar { get; set; }
}
В другом контексте у меня есть что-то вроде этого:
Foo fooInstance = new Foo();
DoSomething(fooInstance.Bar);
Затем, в DoSomething
Мне нужно получить fooInstance
от ничего, кроме parameter
. Из контекста следует сохранить, что никакие целые числа не передаются в DoSomething
, а только общедоступные свойства int.
public void DoSomething(int parameter)
{
// need to use fooInstance here as well,
// and no, it is not possible to just pass it in as another parameter
}
Возможно ли это вообще? Использование отражения или, может быть, настраиваемый атрибут свойства Bar
?
Вам нужно будет пересмотреть свой дизайн. Это невозможно. – BrokenGlass
Я не понимаю, о чем вы просите ... Почему вы не можете дать «Foo» в качестве аргумента? – log0
Почему вы не можете передать его в качестве другого параметра? –