В общем, размеченные объединения составляются как иерархии классов (что означает, что существует новый подкласс для каждого случая размеченного объединения). Однако в вашем случае ситуация проще, потому что ни один из случаев не несет никаких значений.
Если вы посмотрите на скомпилированный код, вы увидите, что сгенерированное представление .NET дает вам что-то вроде:
class ServiceActionType {
public static ServiceActionType ServiceRequest { get; }
public static ServiceActionType ServiceResponse { get; }
public static ServiceActionType ServiceEventInvocation { get; }
// etc. for all the other cases
}
Это означает, что если вы хотите построить одно из значений размеченного объединения, вам просто нужно вызвать метод получения свойства (статического), представляющего нужный вам случай.
Если бы у вас был случай с аргументами, скажем ServiceRequest of RequestInfo
, тогда сгенерированный класс включал бы вместо этого NewServiceRequest
метод, который принимал бы необходимые параметры:
public static ServiceActionType NewServiceRequest(RequestInfo info);
Тем не менее, я не совсем уверен, почему вы хотите это сделать, поэтому создание кода может быть не лучшим подходом. Вы также можете рассмотреть возможность использования цитат F #, которые могут быть скомпилированы в динамические методы, а создание цитаты, представляющей конструкцию случая DU, довольно просто с использованием Expr.NewUnionCase
.
person
Tomas Petricek
schedule
22.03.2013