Как Вы создаете подтипы у Американского лося?

Хотя следующий ответ делает то, что вы хотите, на самом деле нет смысла, потому что это просто ненужно. Если вам нужно указать свойство, вы можете просто установить его напрямую.

Здесь, наверное, как можно ближе. Я не верю, что вы можете использовать params, потому что для этого потребуется, чтобы все TProp были одного типа.

В Visual Studio, когда вы перейдете к периоду, вы получите intellisense:

enter image description here

using System;
using System.Linq.Expressions;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        var orderDto = new OrderDto
        {
            Id = 1,
            Name = "Name",
            CreatedOn = DateTime.UtcNow,
            CompletedOn = DateTime.UtcNow.AddMinutes(30),
            Misc = Guid.NewGuid()
        };

        Console.WriteLine($"{orderDto.Id} {orderDto.Name} {orderDto.CreatedOn} {orderDto.CompletedOn} {orderDto.Misc}");

        orderDto.DefaultFor(x => x.Id, x => x.Name, x => x.CreatedOn, x => x.CompletedOn);

        Console.WriteLine($"{orderDto.Id} {orderDto.Name} {orderDto.CreatedOn} {orderDto.CompletedOn} {orderDto.Misc}");
    }
}

public static class ObjectExtensions
{
    public static void DefaultFor(this TObject instance, 
        Expression> selector1, 
        Expression> selector2,
        Expression> selector3,
        Expression> selector4)
        where TObject : class
    {
        DefaultFor(instance, selector1, selector2, selector3);
        DefaultFor(instance, selector4);
    }

    public static void DefaultFor(this TObject instance, 
        Expression> selector1, 
        Expression> selector2,
        Expression> selector3)
        where TObject : class
    {
        DefaultFor(instance, selector1, selector2);
        DefaultFor(instance, selector3);
    }

    public static void DefaultFor(this TObject instance, 
        Expression> selector1, 
        Expression> selector2)
        where TObject : class
    {
        DefaultFor(instance, selector1);
        DefaultFor(instance, selector2);
    }

    public static void DefaultFor(this TObject instance, Expression> selector)
        where TObject : class
    {
        if (instance == null)
            throw new ArgumentNullException();

        var memberExpression = (MemberExpression)selector.Body;
        var property = (PropertyInfo)memberExpression.Member;

        property.SetValue(instance, default(TProp));
    }
}

public class OrderDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime? CompletedOn { get; set; }
    public Guid Misc { get; set; }
}

DotNetFiddle Пример

Вывод:

1 Имя 29.03.2009 5:14:06 3/29/2019 5:44:06 3800be41-7fe1-42da -ada5-4fe33ac04a84

0 1/1/0001 12:00:00 AM 3800be41-7fe1-42da-ada5-4fe33ac04a84

blockquote>

10
задан Axeman 22 March 2009 в 17:29
поделиться

2 ответа

Я плохо знаком с Американским лосем также, но я думаю для подтипа, необходимо добавить

use Moose::Util::TypeConstraints;
14
ответ дан 3 December 2019 в 16:54
поделиться

Вот тот, который я украл из поваренной книги ранее:

package MyPackage;
use Moose;
use Email::Valid;
use Moose::Util::TypeConstraints;

subtype 'Email'
   => as 'Str'
   => where { Email::Valid->address($_) }
   => message { "$_ is not a valid email address" };

has 'email'        => (is =>'ro' , isa => 'Email', required => 1 );
10
ответ дан 3 December 2019 в 16:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: