Không. Hoặc bạn có thể chấp nhận một lambda như một đối số, mà cũng cung cấp cho bạn toàn quyền kiểm soát trong đó một phần của quá trình "sáng tạo" sẽ được gọi. Bằng cách này bạn có thể gọi nó thích:
MyClass instance = MyClass.FactoryCreate(c=>
{
c.SomeProperty = something;
c.AnotherProperty = somethingElse;
});
create sẽ trông tương tự như:
public static MyClass FactoryCreate(Action<MyClass> initalizer)
{
MyClass myClass = new MyClass();
//do stuff
initializer(myClass);
//do more stuff
return myClass;
}
Một lựa chọn khác là để trở về một người thợ xây để thay thế (với một nhà điều hành diễn viên tiềm ẩn để MyClass). Mà bạn sẽ gọi như:
MyClass instance = MyClass.FactoryCreate()
.WithSomeProperty(something)
.WithAnotherProperty(somethingElse);
Kiểm tra this cho trình tạo
Cả hai phiên bản đều được kiểm tra tại thời gian biên dịch và có hỗ trợ IntelliSense đầy đủ.
Một lựa chọn thứ ba mà đòi hỏi phải có một constructor mặc định:
//used like:
var data = MyClass.FactoryCreate(() => new Data
{
Desc = "something",
Id = 1
});
//Implemented as:
public static MyClass FactoryCreate(Expression<Func<MyClass>> initializer)
{
var myclass = new MyClass();
ApplyInitializer(myclass, (MemberInitExpression)initializer.Body);
return myclass ;
}
//using this:
static void ApplyInitializer(object instance, MemberInitExpression initalizer)
{
foreach (var bind in initalizer.Bindings.Cast<MemberAssignment>())
{
var prop = (PropertyInfo)bind.Member;
var value = ((ConstantExpression)bind.Expression).Value;
prop.SetValue(instance, value, null);
}
}
của nó giữa một giữa kiểm tra tại thời gian biên dịch và không được chọn. Nó cần một số công việc, vì nó đang buộc biểu hiện liên tục trên các bài tập. Tôi nghĩ rằng bất cứ điều gì khác là các biến thể của các phương pháp đã có trong các câu trả lời. Hãy nhớ rằng bạn cũng có thể sử dụng các bài tập bình thường, xem xét nếu bạn thực sự cần bất kỳ điều này.
Chúc C# thêm một số đường cho phương pháp "Tạo" tĩnh như thế này (ví dụ như "Thêm" cho bộ sưu tập) :) – nawfal