Re: Сопоставление match типа System.Type
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.01.10 13:17
Оценка:
Здравствуйте, 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));
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.