Хотя следующий ответ делает то, что вы хотите, на самом деле нет смысла, потому что это просто ненужно. Если вам нужно указать свойство, вы можете просто установить его напрямую.
Здесь, наверное, как можно ближе. Я не верю, что вы можете использовать params
, потому что для этого потребуется, чтобы все TProp
были одного типа.
В Visual Studio, когда вы перейдете к периоду, вы получите intellisense:
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; }
}
Вывод:
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>
Я плохо знаком с Американским лосем также, но я думаю для подтипа, необходимо добавить
use Moose::Util::TypeConstraints;
Вот тот, который я украл из поваренной книги ранее:
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 );