استفاده از متد سازنده دوم پارامتر T در کلاس های Generic

by MDP 11. February 2012 02:00

 

کلاس های Generic کلاس هایی هستند که در حقیقت PlaceHolder هایی هستند که با توجه به آرگمان ورودی فعالیت هایی متناسب با اون نوع متغییر رو انجام میدن.

کلاس های Generic در ورژن های جدید .Net انقلاب بزرگی رو به وجود آوردند.

کلاس هایی مثل IList<T> ، Func<T,T>  و ... مثال هایی از این نوع  هستند.

 

کلاس های Generic برای محدود کردن ورودی هاشون از مکانیزم جالبی استفاده کنند.

شما در جلوی اسم کلاس میتونید محدودیت هایی رو برای ورودی ها در نظر بگیرید.برای درک بیشتر به مثال زیر توجه کنید :

public interface IEntity
    {
        Guid Guid { get; set; }
    }

    public class User : IEntity
    {
        public Guid Guid
        { get; set; }
        // . . .
    }

    public class Department
    {
        // . . . 
    }

    public class MyGenericClass<T>
        where T : IEntity, new()
    {
        public T MyTType { get; set; }  
        public MyGenericClass()
        {
            MyTType = new T();
        }
    }

من کلاس MyGenericClass را محدود به استفاده از نوعی از ورودی کردم که فقط Interface ای به نام IEntity را پیاده سازی کرده باشد و حتمی متد سازنده داشته باشد.

تا اینجا همه چیز خوب انجام شده است ، اگر به متد سازنده کلاس MyGenericClass  دقت کنید متوجه می شید که من یه متغیر از نوع ورودی را بدون اینکه به طور دقیق از ورودی اطلاعای داشته باشم ساخته ام.

ولی اگر من لازم داشته باشم به T برای ساخته شدن آرگمان پاس بدهم چی ؟ 

متاسفانه کلاس های Generic تنها امکانی که در اختیار برنامه نویس قرار می دهند فقط فهمیدن این نکته است که T حتمی قابلیت وحله سازی دارد.

ولی راه حل چیست ؟

راه حل استفاده از Activator ها است.

برای حل مشکل فوق راه زیر به خوبی کار خواهد کرد :

public class User : IEntity
    {

        public User (int id)
        {
            
        }

        public Guid Guid
        { get; set; }
        // . . .
    }

    public class MyGenericClass<T>
        where T : IEntity, new()
    {
        public T MyTType { get; set; }  
        public MyGenericClass()
        {
            MyTType = new T();
        }

        public MyGenericClass(int id)
        {
            MyTType = (T)Activator.CreateInstance(typeof (T), id);
        }
    }

نکته : Activator ها Performance خوبی ندارند تا جایی که می توانید از روش هایی استفاده کنید که نیازی به استفاده از این روش نباشد.

 

Tags: , , ,

.Net

My Groups

Poll

از چه پلتفرمی برای توسعه استفاده می کنید



Show Results

Month List