Здравствуйте, CodingUnit, Вы писали:
CU>Здравствуйте, хотел обратиться за помощью разьяснить мне возможности конструкции match в сопоставлении типов, имеется задача, что получается тип Type при отражении типа свойства и далее надо для разных типов произвести отдельные действия, конечный объект свойства при этом еще не существует, если писать так, то компилятор выдает ошибку "invalid pattern":
CU>def CheckType(t : Type)
CU>{
CU>| typeof(bool) => ...
CU>| typeof(byte) => ...
CU>| typeof(int) => ...
CU>}
На то у типов есть свойство FullName. А пытаться сравнивать экземпляры типа Type вообще опасно, так как они могут представлять типы загруженные из разных сборок. При этом казалось бы одинаковые типы не будут считаться идентичными.
CU>Вопрос следующий возможно ли в текущем синтаксисе производить сопоставление типа Type, определяя тип, если нет то можно ли ввести такую возможность в синтаксис (посредством макросов или еще как то), так как такая задача встречается часто при отражении, в C# очень смущают конструкции типа
Можно конечно делать так:
def CheckType(t : Type)
{
| _ when t.Equals(typeof(bool)) => ...
| _ when t.Equals(typeof(byte)) => ...
| _ when t.Equals(typeof(int)) => ...
}
но особого смысла в этом нет.
CU>object obj;
CU>if (obj is Customer)
CU>{
CU>Customer cust=obj as Customer;
CU>... действия на экземпляре Customer
CU>}
CU>if (obj is AnotherCustomer)
CU>{
CU>AnotherCustomer cust=obj as AnotherCustomer;
CU>...
CU>}
Собсвтенно паттерн "is" как раз без проблем можно использоать:
def CheckType(_ : object)
{
| x is bool => // здесь x имеет тип bool
| x is byte => // здесь x имеет тип byte
| x is int => // здесь x имеет тип int
| _ => // в ином случае ...
}
Важно понимть, что паттерн-матчинг позволяет распозновать образцы на основании типа объекта или его структуры. Он не позволяет (за исключением использования защиты "when") сравнивать Type для любых типов — это один и тот же тип объектов. Следовтательно можно создать паттерн который будет разбирать структуру объектов этого типа, но отличить их о н не может.
Скажем можно конечно распознавать типы таким образом:
def сheckType(t : Type)
{
| Type where (FullName="System.Bool") => WriteLine("bool");
| Type where (FullName="System.Byte") => WriteLine("byte");
| Type where (FullName="System.Int32") => WriteLine("int");
| _ => WriteLine("xz")
}
сheckType(typeof(byte));
Но зачем так извращаться когда можно просто сравнивать имя?
Ведь так проще:
def сheckType(t : Type)
{
match (t.FullName)
{
| "System.Bool" => WriteLine("bool");
| "System.Byte" => WriteLine("byte");
| "System.Int32" => WriteLine("int");
| _ => WriteLine("xz")
}
}
сheckType(typeof(byte));