সি # নতুন টি তৈরি করুন ()


159

নিম্নলিখিত কোডটি দিয়ে আমি কী করার চেষ্টা করছি (তবে ব্যর্থ হচ্ছে) তা আপনি দেখতে পারেন:

protected T GetObject()
{
    return new T();
}

কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে।

সম্পাদনা করুন:

প্রসঙ্গটি নিম্নরূপ ছিল। আমি স্ট্যান্ডার্ডযুক্ত পদ্ধতিতে সমস্ত নিয়ামকদের থেকে প্রাপ্ত কাস্টম নিয়ামক শ্রেণীর সাথে খেলছিলাম। সুতরাং প্রসঙ্গে, আমার নিয়ামক ধরণের অবজেক্টটির একটি নতুন উদাহরণ তৈরি করা দরকার। সুতরাং লেখার সময়, এটি এমন কিছু ছিল:

public class GenericController<T> : Controller
{
    ...

    protected T GetObject()
    {
        return (T)Activator.CreateInstance(ObjectType);
    }        

    public ActionResult Create()
    {
        var obj = GetObject()

        return View(obj);
    }

এবং তাই আমি সিদ্ধান্ত নিয়েছি এখানে প্রতিফলন সবচেয়ে সহজ ছিল। আমি সম্মত হই যে, অবশ্যই প্রশ্নের প্রাথমিক বক্তব্যটি দেওয়া হয়েছে, সঠিক হিসাবে চিহ্নিত করার সবচেয়ে উপযুক্ত উত্তরটি ছিল নতুন () সীমাবদ্ধতাটি ব্যবহার করা। আমি এটি স্থির করেছি।


27
না, আপনি কী চেষ্টা করছেন এবং করতে ব্যর্থ হচ্ছেন তা আমি দেখতে পাচ্ছি না। আমি একটি কোডের টুকরোটি দেখছি যা কোনও কর্মসূচির অংশ হতে পারে, কোনও প্রসঙ্গ, কোনও ত্রুটি বার্তা এবং কোনও ব্যাখ্যা ছাড়াই।
বেন ভয়েগট

17
ওহ, আমি যখন ভুল উত্তর নির্বাচন করা হয় তখন আমি এটি ঘৃণা করি!
ডেভিড হেফারনান

উত্তর:


409

নতুন প্রতিবন্ধকতা একবার দেখুন

public class MyClass<T> where T : new()
{
    protected T GetObject()
    {
        return new T();
    }
}

Tকোনও শ্রেণি হতে পারে যার ডিফল্ট নির্মাতা নেই: new T()এক্ষেত্রে একটি অবৈধ বিবৃতি হবে। new()বাধ্যতা বলছেন যে Tএকটি ডিফল্ট কন্সট্রাকটর, যার ফলে থাকতে হবে new T()আইনগত।

আপনি জেনেরিক পদ্ধতিতে একই সীমাবদ্ধতা প্রয়োগ করতে পারেন:

public static T GetObject<T>() where T : new()
{
    return new T();
}

আপনার যদি প্যারামিটারগুলি পাস করার প্রয়োজন হয়:

protected T GetObject(params object[] args)
{
    return (T)Activator.CreateInstance(typeof(T), args);
}

2
ধন্যবাদ, সাথী - আমি আজ এটি জানতে পেরে আনন্দিত। আমার পদ্ধতির প্রসঙ্গে, আমি প্রতিবিম্ব সমাধানের জন্য গিয়েছিলাম। চিয়ার্স!
হানশান

8
@ নুলিয়াসিনভারবা - হুম ... আপনি যদি প্রশ্নে আপনার পদ্ধতির প্রসঙ্গটি দেখান তবে ভাল লাগবে।
অ্যালেক্স আজা

1
@ নুলিয়াসিনভারবা - আপনি যে পরামিতিগুলির প্রয়োজন সে প্রশ্নটিতে আপনি তা দেখান নি।
অ্যালেক্স আজা

1
@ অ্যালেক্স - যখন আমি তাঁর প্রশ্নটি পড়েছিলাম তখন আমি ধরে নিয়েছিলাম যে সে পরামিতিগুলি চায় না: এস আপনার পক্ষে আপ-ভোট করুন :)
ফিল করুন

নতুন (পরামিতি) সীমাবদ্ধতার মতো কিছু ব্যবহার করা কি সম্ভব?
লুই রাইস


29

অন্য উপায় হ'ল প্রতিবিম্ব ব্যবহার করা:

protected T GetObject<T>(Type[] signature, object[] args)
{
    return (T)typeof(T).GetConstructor(signature).Invoke(args);
}

ধন্যবাদ, সাথী - পদ্ধতির প্রসঙ্গে আমি এই সমাধানটি দিয়েছিলাম।
হানশান

22
ঠিক একটি এফওয়াইআই হিসাবে, এটি বিকল্পভাবে অ্যাক্টিভেটর হিসাবে লেখা যেতে পারে reক্রেইটআইনস্ট্যান্স (টাইপফ (টি), স্বাক্ষর, আরগস); দেখতে msdn.microsoft.com/en-us/library/4b0ww1we.aspx আরো বিস্তারিত জন্য।
ক্রিস বাক্সটার

@ ক্যালগারি কোডার: কোনও প্রকারের স্বাক্ষরের জন্য কী ব্যবহার, আপনি স্বাক্ষর স্পষ্টভাবে উল্লেখ না করেই সরাসরি প্যারামের সাথে ক্রিয়েটইনস্ট্যান্স কল করতে পারেন। উভয় ক্ষেত্রেই যদি কোনও মিলে যাওয়া নির্মাণকারীর উপস্থিতি না থাকে তবে আপনি মিসিংমথোডেক্সপশন পাবেন।
বরিস বি

4
এমনকি যদি এই উত্তরটি আপনার পক্ষে সবচেয়ে ভাল কাজ করে তবে এটি অবশ্যই সম্প্রদায়ের পক্ষে সেরা নয়। এই প্রশ্নের সন্ধানকারী লোকেরা নীচে থেকে উত্তর খুঁজছেন, সত্যই।
ট্র্যাপ করুন

এবং সেই প্রসঙ্গে আসলে কী? দয়া করে এটি আসল প্রশ্নের সাথে যুক্ত করুন।
জেমস

18

কেবলমাত্র সমাপ্তির জন্য, এখানে সর্বোত্তম সমাধানটি প্রায়শই কারখানার ফাংশন যুক্তির প্রয়োজন হয়:

T GetObject<T>(Func<T> factory)
{  return factory(); }

এবং এটিকে কিছু বলুন:

string s = GetObject(() => "result");

আপনি প্রয়োজন হিসাবে উপলব্ধ পরামিতি প্রয়োজন বা ব্যবহার করতে এটি ব্যবহার করতে পারেন।


16

নতুন বাধ্যতা জরিমানা, কিন্তু আপনি যদি টি একটি মান টাইপ খুব হচ্ছে প্রয়োজন, এই ব্যবহার করুন:

protected T GetObject() {
    if (typeof(T).IsValueType || typeof(T) == typeof(string)) {
        return default(T);
    } else {
       return (T)Activator.CreateInstance(typeof(T));
    }
}

7

যেহেতু এই খোলা sourece ফ্রেমওয়ার্ক সি # 4. বাঁধা হয় ImpromptuIntereface এটা যখন আপনার কনস্ট্রাকটর আর্গুমেন্ট আছে, এবং negligibly ধীর যখন এটা না কন্সট্রাকটর এটি উল্লেখযোগ্যভাবে Activator চেয়ে দ্রুত কল DLR ব্যবহার করবে। তবে মূল সুবিধাটি হ'ল এটি সি # ৪.০ alচ্ছিক পরামিতিগুলি সঠিকভাবে নির্মাণকারীদের পরিচালনা করবে, এমন কিছু যা অ্যাক্টিভেটর করবে না।

protected T GetObject(params object[] args)
{
    return (T)Impromptu.InvokeConstructor(typeof(T), args);
}

4

এটি পেতে আমি নিম্নলিখিত কোডগুলি চেষ্টা করেছি:

  protected T GetObject<T>()
    {
        T obj = default(T);
        obj =Activator.CreateInstance<T>();
        return obj ;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.