मेरी प्राथमिकता पर कस्टम प्रकार उत्पन्न करने के लिए एक सरल टी -4 टेम्पलेट का उपयोग करने के लिए है उड़ना। यहां एक उदाहरण है जिसका मैंने हाल ही में एक निजी परियोजना पर उपयोग किया था। लाइन 10 पर, जेनरेट किए गए प्रकारों की एक सूची है। इनमें से प्रत्येक चीज int
थी, लेकिन अब वे दृढ़ता से टाइप की गई हैं।
यह सामान्य "आदिम जुनून" विरोधी पैटर्न से बचकर एक और अधिक कार्यात्मक प्रतिमान का उपयोग करने के लिए आपके कोड को भी स्थानांतरित करता है।
मैं जिस टेम्पलेट का उपयोग कर रहा हूं वह है। अपडेट/संशोधित करने के लिए स्वतंत्र महसूस करें (यदि आप कुछ भी उपयोगी जोड़ते हैं तो हम सभी को बताएं)।
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
<#
// List of types to generate:
var createTypeList = new[] { "XDim", "YDim", "YDelta", "DelayValue", "HValue", "Score", "TplIndexValue" };
#>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.Contracts;
// ReSharper disable CheckNamespace
<#
for(int i = 0; i < createTypeList.Length; i++)
{
var typeName = createTypeList[i];
#>
[ImmutableObject(true)]
public struct <#=typeName#> : IComparable<<#=typeName#>>
{
public <#=typeName#>(int value) { Value = value; }
[Pure] public int Value { get; }
[Pure] public bool Equals(<#=typeName#> other) => Value == other.Value;
[Pure]
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (Equals(this, obj)) return true;
return obj.GetType() == GetType() && Equals((<#=typeName#>)obj);
}
[Pure]
public override int GetHashCode()
{
unchecked
{
return (base.GetHashCode() * 397)^Value;
}
}
[Pure] public static bool operator ==(<#=typeName#> left, <#=typeName#> right) => Equals(left, right);
[Pure] public static bool operator !=(<#=typeName#> left, <#=typeName#> right) => !Equals(left, right);
[Pure] public int CompareTo(<#=typeName#> other) => Equals(this, other) ? 0 : Value.CompareTo(other.Value);
[Pure] public static bool operator <(<#=typeName#> left, <#=typeName#> right) => Comparer<<#=typeName#>>.Default.Compare(left, right) < 0;
[Pure] public static bool operator >(<#=typeName#> left, <#=typeName#> right) => Comparer<<#=typeName#>>.Default.Compare(left, right) > 0;
[Pure] public static bool operator <=(<#=typeName#> left, <#=typeName#> right) => Comparer<<#=typeName#>>.Default.Compare(left, right) <= 0;
[Pure] public static bool operator >=(<#=typeName#> left, <#=typeName#> right) => Comparer<<#=typeName#>>.Default.Compare(left, right) >= 0;
[Pure] public override string ToString() => $"{nameof(Value)}: {Value}";
}
<#
}
#>
निजी मूल्य के पास कोई प्रकार नहीं है? क्या वह सही है? – bendewey
@bendewey: वह एक टाइपो था। इस पर ध्यान दिलाने के लिए धन्यवाद। –
उत्कृष्ट, धन्यवाद! एक फॉलोअप है। चूंकि कुछ अलग-अलग आईडी की ज़रूरत है, ऐसा लगता है कि मेरे पास एक मास्टर आईडी क्लास होना चाहिए जो यह सब करता है, और उसके बाद बस उप-आईडी प्राप्त करता है।लेकिन ऐसा लगता है कि यह काम नहीं करता है जैसा मैंने सोचा था। आईडी के लिए ऊपर का नाम बदलने और सार्वजनिक वर्ग ParticipantID लेखन: आईडी {} एक त्रुटि देता है: – second