क्या मैं आंशिक वर्गों में गुणों को परिभाषित कर सकता हूं, फिर उन्हें किसी अन्य आंशिक वर्ग में विशेषताओं के साथ चिह्नित कर सकता हूं?


84

क्या कोई तरीका है जिससे मैं एक उत्पन्न कोड फ़ाइल बना सकता हूँ जैसे:

public partial class A {
public string a {get; set;}
}

और फिर दूसरी फाइल में:

public partial class A {
[Attribute("etc")]
public string a {get; set;}
}

ताकि मैं डेटाबेस से उत्पन्न एक वर्ग रख सकूं और फिर इसे चिह्नित करने के लिए एक गैर-उत्पन्न फ़ाइल का उपयोग कर सकूं?


"डेटाबेस से उत्पन्न" कितना है? केवल संपत्ति परिभाषाएँ, या कोड के रूप में अच्छी तरह से?
स्नोमार्क

1
लघु उत्तर, नहीं। लंबे उत्तर, stackoverflow.com/questions/456624/… की डुबकी ।
कर्क वॉक

@ सिनेमार्क: संपत्ति की परिभाषाएँ, मैं किसी अन्य कोड को हाथ से करने की योजना बनाता हूं।
क्रिस मैककैल

1
क्या आप आंशिक वर्ग के बजाय इंटरफ़ेस + कार्यान्वयन विभाजन के साथ कर सकते हैं? डेटाबेस से इंटरफ़ेस उत्पन्न करें, कार्यान्वयन में कार्यान्वयन करें (और विशेषताएँ जोड़ें)।
स्नैमर

हाँ यह संभव है, लेकिन मेटाडेटा के उपयोग के साथ फिर अन्य आंशिक विरासत है कि मेटाडेटा
साइबरनाजा

जवाबों:


33

मैंने स्कॉट गुथरी (इसके अंत के निकट) के एक लेख में ऐसा कुछ देखा है - हालांकि, मैंने खुद इसे आजमाया नहीं।
http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

[MetadataType(typeof(Person_Validation))]
public partial class Person
{
    // Partial class compiled with code produced by VS designer
}

[Bind(Exclude="ID")]
public class Person_Validation
{
    [Required(ErrorMessage = "First Name Required")]
    [StringLength(50, ErrorMessage = "Must be under 50 characters")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name Required")]
    [StringLength(50, ErrorMessage = "Must be under 50 characters")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Age Required")]
    [Range(0, 120, ErrorMessage = "Age must be between 0 and 120")]
    public int Age { get; set; }

    [Required(ErrorMessage = "Email Required")]
    [Email(ErrorMessage = "Not a valid email")]
    public string Email { get; set; }
}

10
यह उत्तर उल्लिखित है, लेकिन यह ओपी द्वारा पूछे गए प्रश्न का सामान्य समाधान नहीं है। विशेषताओं के उपभोक्ताओं को अभी भी मेटा डेटा वर्ग की तलाश करने के लिए जानने की आवश्यकता है - अर्थात ये विशेषताएँ Attribute.GetCustomAttribute (...) द्वारा वापस नहीं की जाएंगी। (सौभाग्य से कई उपयोग-मामलों के लिए, उपभोक्ताओं को एमएस द्वारा लिखा जाता है और कुछ स्थितियों में यह काम करेगा।)
किर्क वोल् सिप

1
यह समाधान समस्या का समाधान नहीं करता है। हम सदस्यों को किसी अन्य फ़ाइल में सजाने के लिए क्यों देखते हैं? क्‍योंकि हर बार डिज़ाइनर के चलने पर क्लास OVERWRITTEN होती है। इस प्रकार आपकी विशेषता [MetaDataType ...हर बार डिज़ाइनर के चलने पर साफ़ हो जाएगी

2
@Desolator - विचार यह है कि आप MetadataTypeडिज़ाइनर द्वारा बनाई गई फ़ाइल में विशेषता नहीं डालते हैं , आप इसे दूसरी फ़ाइल में डालते हैं जहाँ आंशिक वर्ग Personपरिभाषित होता है।
डैन डमिट्रू

1
इस समाधान के साथ समस्या यह है कि कक्षा को आंशिक होना चाहिए
साइबरनाजा

85

इस तरह के मामलों के लिए मैं इसका उपयोग कर रहा हूं। यह उपयोगी है जब आपके पास स्वतः-उत्पन्न कक्षाएं होती हैं जिन्हें आप विशेषताओं के साथ सजाना चाहते हैं। मान लीजिए कि यह स्वतः-निर्मित वर्ग है:

public partial class UserProfile
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

और कहते हैं, मैं एक विशेषता जोड़ना चाहूंगा कि UserId कुंजी है। मैं फिर इस तरह से एक अन्य फ़ाइल में एक आंशिक वर्ग बनाऊंगा:

[Table("UserProfile")]
[MetadataType(typeof(UserProfileMetadata))]
public partial class UserProfile
{
    internal sealed class UserProfileMetadata
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
    }
}

महान समाधान। मुझे पता था कि आप कई फ़ाइलों में विशेषताओं के साथ आंशिक वर्ग को सजा सकते हैं और यहां तक ​​कि घोषणाओं में इंटरफेस और विरासत में मिला वर्ग भी जोड़ सकते हैं, लेकिन मैंने MetadataTypeविशेषता से संबंध नहीं बनाया । बहुत बढ़िया!
पफल्गू

क्या होगा यदि मैं कंस्ट्रक्टर के लिए एक विशेषता जोड़ना चाहता हूं UserProfile?
बॉटिस

2
MetadataType.NET Core में मौजूद नहीं है
WoIIe

2
.net कोर का उपयोग करता हैModelMetadataType
YLJ

1
@Dave सपोर्ट .NET कोर 3.0 में आने वाला माना जाता है
रोजर विल्क्स

2

यह मेरा उत्तर है
विभिन्न श्रेणी की फाइलें या आप मेटाडेटा को एक ही फाइल में जोड़ सकते हैं लेकिन नाम स्थान को समान रखें..तो वे एक दूसरे को स्पष्ट रूप से देख सकते हैं।

ध्यान रखें जब आप अपने मॉडल को अपडेट करते हैं जैसे कि अधिक कॉलम जोड़ें तो आपको प्रोजेक्ट क्लास को भी अपडेट करना होगा।

--your model class
public partial class A {
    public string a {get; set;}
}

--your project class 
public class Ametadata {
     [Attribute("etc")]
     public string a {get; set;}
}


[MetadataType(typeof(Ametadata))]
public partial class A
{
}

1

आपको Aनीचे दिए उदाहरण की तरह अपनी कक्षा के लिए एक आंशिक वर्ग को परिभाषित करने की आवश्यकता है

using System.ComponentModel.DataAnnotations;

// your auto-generated partial class
public partial class A 
{
    public string MyProp { get; set; }
}

[MetadataType(typeof(AMetaData))]
public partial class A 
{

}

public class AMetaData
{
    [System.ComponentModel.DefaultValue(0)]
    public string MyProp { get; set; }
}

0

ऐसे नहीं; संकलक शिकायत करेगा कि सदस्य को कई भागों में परिभाषित किया गया है। हालांकि, जैसा कि कस्टम विशेषताओं का उपयोग प्रकृति में प्रतिबिंबित होता है, आप "मेटाडेटा" वर्ग को परिभाषित कर सकते हैं और सज्जाकारों को शामिल करने के लिए इसका उपयोग कर सकते हैं।

public class A
{
   public string MyString;
}

public class AMeta
{
   [TheAttribute("etc")]
   public object MyString;
}

...

var myA = new A();
var metaType = Type.GetType(myA.GetType().Name + "Meta");
var attributesOfMyString = metaType.GetMember("MyString").GetCustomAttributes();

1
यह कितनी बार है कि अभिनेता जो अपने गुणों के साथ विशेषताओं को जोड़ रहा है, वह भी उनका उपभोग करने वाला व्यक्ति है और इसलिए जादुई "मेटा" कक्षाओं की तलाश करना जानता है?
कर्क वॉक

बहुत बार, मेरे अनुभव में। यह एक मौजूदा पहलू-उन्मुख ढांचे के लिए काम नहीं करेगा, लेकिन यदि आप अपने डोमेन को कस्टमाइजेशन विशेषताओं के साथ सजा रहे हैं, तो आप उन्हें ढूंढ रहे हैं और जहां परिभाषित कर सकते हैं। मेरी टीम ने हमारे एक प्रोजेक्ट पर ठीक यही किया है। मुख्य नुकसान अन्य वर्ग की तलाश में नहीं है; यह दो समानांतर वर्गों को बनाए रखते हुए विकसित हो रहा है, एक कार्यात्मक, दूसरा सजावटी। यह आंशिक वर्गों में भी एक समस्या होगी, यदि आप पहली बार में आंशिक क्षेत्रों / गुणों को परिभाषित करने में सक्षम थे।
कीथ्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.