Нельзя преобразовать Func<float>
в Func<object>
, а также Action<float>
в Action<object>
.Это связано с тем, что ковариация и контравариантность плохо сочетаются с типами значений (в итоге ковариация и контравариантность - это ловкость рук, а не реальные преобразования между типами, и поэтому требуют, чтобы оба типа имели одинаковую структуру памяти ...ссылка, так что легко сделать ковариацию / контравариантность между двумя ссылками, но float
- это тип значения, который сильно отличается от object
, который является ссылочным типом)
И вв обоих случаях вы должны добавить параметр типа CProperty
к Func/Action
, например Func<CProperty, float>(cp => cp.value)
, но value
должен быть public
... Это потому, что анонимные методы являются "статическими", они не имеют свободныхдоступ к справочнику this
, поэтому вы должны передать его в качестве параметра ...
public class CProperty
{
public CProperty(string name, Func<CProperty, object> get, Action<CProperty, object> set)
{
this.name = name;
this.get = get;
this.set = set;
}
private string name;
public Func<CProperty, object> get;
public Action<CProperty, object> set;
public object value;
}
var properties = new CProperty[]
{
new CProperty(
"name1",
new Func<CProperty, object>(cp => cp.value),
new Action<CProperty, object>((cp, v) => cp.value = v)
),
};
, или вы можете даже захватить this
:
public class CProperty
{
public CProperty(string name, Func<CProperty, Func<object>> get, Func<CProperty, Action<object>> set)
{
this.name = name;
this.get = get(this);
this.set = set(this);
}
private string name;
public Func<object> get;
public Action<object> set;
public object value;
}
var properties = new CProperty[]
{
new CProperty(
"name1",
cp => new Func<object>(() => cp.value),
cp => new Action<object>((v) => cp.value = v)
),
};
ВВ конце концов, я думаю, что вы довольно далеки от того, что хотите ... вам придется вернуться к доске с классом CProperty
.