Я нахожусь в ситуации, когда многие мои классы представляют собой контейнеры с хорошо известными, но неупорядоченными объектами разных типов, например, Контейнер может выглядеть следующим образом:
public class Container
{
public A A { get; private set; }
public B B { get; private set; }
public C C { get; private set; }
public bool StoreIfKnown(object o)
{
// TODO...
}
}
То есть, если o
имеет тип A
, его следует сохранить в свойстве A
, ввести B
в свойстве B
и т. Д.
В F # метод StoreIfKnown
может быть записан примерно так (извините за синтаксические ошибки, мой F # не большой и довольно ржавый):
match o with
| ?: A a -> A <- a; true
| ?: B b -> B <- b; true
| ?: C c -> C <- c; true
| _ -> false
Но в C # единственный путь кажется довольно многословным:
if (o is A)
{
this.A = (A)o;
return true;
}
if (o is B)
{
this.B = (B)o;
return true;
}
// etc.
return false;
Я мог бы сделать это с ключевым словом as
, чтобы избежать шаблона test / cast, который был бы быстрее, но еще более подробным.
Есть ли какой-нибудь элегантный способ сделать это в C #?