এখানে রোজলিন বাস্তবায়ন, যাতে আপনি নিজের বৈশিষ্ট্য তৈরি করতে পারেন যা ফ্লাইতে সতর্কতা বা ত্রুটি দেয়।
আমি টাইপ কল একটি বৈশিষ্ট্য তৈরি করেছি IdeMessage
যা সতর্কতা উত্পন্ন করে এমন বৈশিষ্ট্যটি হবে:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class IDEMessageAttribute : Attribute
{
public string Message;
public IDEMessageAttribute(string message);
}
এটি করার জন্য আপনাকে প্রথমে রোজলিন এসডিকে ইনস্টল করতে হবে এবং বিশ্লেষক দিয়ে একটি নতুন ভিএসআইএক্স প্রকল্প শুরু করতে হবে। আমি বার্তাগুলির মতো কিছু কম প্রাসঙ্গিক টুকরো বাদ দিয়েছি, কীভাবে এটি করবেন তা আপনি বুঝতে পারেন। আপনার বিশ্লেষকটিতে আপনি এটি করেন
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(AnalyzerInvocation, SyntaxKind.InvocationExpression);
}
private static void AnalyzerInvocation(SyntaxNodeAnalysisContext context)
{
var invocation = (InvocationExpressionSyntax)context.Node;
var methodDeclaration = (context.SemanticModel.GetSymbolInfo(invocation, context.CancellationToken).Symbol as IMethodSymbol);
//There are several reason why this may be null e.g invoking a delegate
if (null == methodDeclaration)
{
return;
}
var methodAttributes = methodDeclaration.GetAttributes();
var attributeData = methodAttributes.FirstOrDefault(attr => IsIDEMessageAttribute(context.SemanticModel, attr, typeof(IDEMessageAttribute)));
if(null == attributeData)
{
return;
}
var message = GetMessage(attributeData);
var diagnostic = Diagnostic.Create(Rule, invocation.GetLocation(), methodDeclaration.Name, message);
context.ReportDiagnostic(diagnostic);
}
static bool IsIDEMessageAttribute(SemanticModel semanticModel, AttributeData attribute, Type desiredAttributeType)
{
var desiredTypeNamedSymbol = semanticModel.Compilation.GetTypeByMetadataName(desiredAttributeType.FullName);
var result = attribute.AttributeClass.Equals(desiredTypeNamedSymbol);
return result;
}
static string GetMessage(AttributeData attribute)
{
if (attribute.ConstructorArguments.Length < 1)
{
return "This method is obsolete";
}
return (attribute.ConstructorArguments[0].Value as string);
}
এর জন্য কোনও কোডফিক্সপ্রভাইডার নেই আপনি এটি সমাধান থেকে সরাতে পারেন।