টাইপলাইট এবং টি 4 টিএস উভয়ের উপরেই দেখতে ভাল লাগল, কেবল একটি বেছে নিয়েছে, টাইপলাইট, এর জন্য সমর্থন পেতে কাঁটাচামচ করেছে
- মান টাইপস ,
- Nullables
- উট কেসিং ( টাইপস্ক্রিপ্টের মূল ডকটি উট ব্যবহার করে এবং এটি সি # এর সাথে খুব সুন্দর হয়)
- সর্বজনীন ক্ষেত্র (পরিষ্কার এবং পঠনযোগ্য পোকো পছন্দ করে, এটি সি # সংকলকটির জন্যও সহজ করে তোলে)
- মডিউল জেনারেশন অক্ষম করুন
তারপরে আমার সি # ইন্টারফেসের প্রয়োজন ছিল এবং আমার নিজের জিনিসটি বেক করার সময় হয়েছে এবং একটি সহজ টি 4 স্ক্রিপ্ট লিখেছিলাম যা আমার প্রয়োজন অনুযায়ী করে। এটি এনামগুলিকেও অন্তর্ভুক্ত করে । কোনও রেপোর দরকার নেই, কেবলমাত্র টি -4 এর 100 টি লাইন।
ব্যবহার
কোনও লাইব্রেরি, কোনও নিউগেট নয়, কেবল এই সাধারণ সরল টি 4 ফাইল - ভিজ্যুয়াল স্টুডিওতে "অ্যাড আইটেম" ব্যবহার করুন এবং যে কোনও টি 4 টেম্পলেট চয়ন করুন। তারপরে এটি ফাইলটিতে আটকান। প্রতিটি লাইন এতে "ACME" দিয়ে মানিয়ে নিন। প্রতিটি সি # শ্রেণির জন্য একটি লাইন যুক্ত করুন
<#= Interface<Acme.Duck>() #>
অর্ডার সম্পর্কিত বিষয়গুলি, যে কোনও পরিচিত ধরণটি ফোলউইং ইন্টারফেসে ব্যবহৃত হবে। যদি আপনি কেবল ইন্টারফেস ব্যবহার করেন তবে ফাইলটি এক্সটেনশন .d.ts হতে পারে, এনামগুলির জন্য আপনার একটি .ts ফাইলের প্রয়োজন , যেহেতু একটি চলক তাত্ক্ষণিক হয়।
কাস্টমাইজেশন
স্ক্রিপ্ট হ্যাক।
<#@ template debug="true" hostSpecific="true" language="C#" #>
<#@ output extension=".ts" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ assembly name="$(TargetDir)ACME.Core.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Linq" #>
<#= Interface<Acme.Bunny>() #>
<#= Interface<Acme.Duck>() #>
<#= Interface<Acme.Birdy>() #>
<#= Enums<Acme.CarrotGrade>() #>
<#= Interface<Acme.LinkParticle>() #>
<#+
List<Type> knownTypes = new List<Type>();
string Interface<T>()
{
Type t = typeof(T);
var sb = new StringBuilder();
sb.AppendFormat("interface {0} {{\n", t.Name);
foreach (var mi in GetInterfaceMembers(t))
{
sb.AppendFormat(" {0}: {1};\n", this.ToCamelCase(mi.Name), GetTypeName(mi));
}
sb.AppendLine("}");
knownTypes.Add(t);
return sb.ToString();
}
IEnumerable<MemberInfo> GetInterfaceMembers(Type type)
{
return type.GetMembers(BindingFlags.Public | BindingFlags.Instance)
.Where(mi => mi.MemberType == MemberTypes.Field || mi.MemberType == MemberTypes.Property);
}
string ToCamelCase(string s)
{
if (string.IsNullOrEmpty(s)) return s;
if (s.Length < 2) return s.ToLowerInvariant();
return char.ToLowerInvariant(s[0]) + s.Substring(1);
}
string GetTypeName(MemberInfo mi)
{
Type t = (mi is PropertyInfo) ? ((PropertyInfo)mi).PropertyType : ((FieldInfo)mi).FieldType;
return this.GetTypeName(t);
}
string GetTypeName(Type t)
{
if(t.IsPrimitive)
{
if (t == typeof(bool)) return "bool";
if (t == typeof(char)) return "string";
return "number";
}
if (t == typeof(decimal)) return "number";
if (t == typeof(string)) return "string";
if (t.IsArray)
{
var at = t.GetElementType();
return this.GetTypeName(at) + "[]";
}
if(typeof (System.Collections.IEnumerable).IsAssignableFrom(t))
{
var collectionType = t.GetGenericArguments()[0]; // all my enumerables are typed, so there is a generic argument
return GetTypeName(collectionType) + "[]";
}
if (Nullable.GetUnderlyingType(t) != null)
{
return this.GetTypeName(Nullable.GetUnderlyingType(t));
}
if(t.IsEnum) return "number";
if(knownTypes.Contains(t)) return t.Name;
return "any";
}
string Enums<T>() // Enums<>, since Enum<> is not allowed.
{
Type t = typeof(T);
var sb = new StringBuilder();
int[] values = (int[])Enum.GetValues(t);
sb.AppendLine("var " + t.Name + " = {");
foreach(var val in values)
{
var name = Enum.GetName(typeof(T), val);
sb.AppendFormat("{0}: {1},\n", name, val);
}
sb.AppendLine("}");
return sb.ToString();
}
#>
স্ক্রিপ্টের পরবর্তী স্তরটি হবে এমভিসি জসনকন্ট্রোলার শ্রেণি থেকে পরিষেবা ইন্টারফেস তৈরি করা।