AddressOf در دستور Threading که قدیمی هست استفاده میشه که عمدتا بصورت:
متد Work برای این تعریف شده که مفوم کد برسونه.
Dim t As New Threading.Thread(AddressOf work) t.Start()
Dim t As New Threading.Thread(AddressOf work) t.Start()
using (var capture = new CvCapture(@"..\..\Videos\drop.avi")) { var image = capture.QueryFrame(); }
IplImage image; while ((image = Capture.QueryFrame()) != null) { _pictureBoxIpl1.RefreshIplImage(image); Thread.Sleep(interval); Application.DoEvents(); }
timer = new Timer(); timer.Interval = (int)(1000 / Capture.Fps); timer.Tick += Timer_Tick;
private void FrmMain_Load(object sender, System.EventArgs e) { _pictureBoxIpl1 = new PictureBoxIpl { AutoSize = true }; flowLayoutPanel1.Controls.Add(_pictureBoxIpl1); }
private void BtnStart_Click(object sender, System.EventArgs e) { if (_worker != null && _worker.IsBusy) { return; } _worker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; _worker.DoWork += workerDoWork; _worker.ProgressChanged += workerProgressChanged; _worker.RunWorkerCompleted += workerRunWorkerCompleted; _worker.RunWorkerAsync(); BtnStart.Enabled = false; }
private void workerDoWork(object sender, DoWorkEventArgs e) { using (var capture = new CvCapture(@"..\..\Videos\drop.avi")) { var interval = (int)(1000 / capture.Fps); IplImage image; while ((image = capture.QueryFrame()) != null && _worker != null && !_worker.CancellationPending) { _worker.ReportProgress(0, image); Thread.Sleep(interval); } } } private void workerProgressChanged(object sender, ProgressChangedEventArgs e) { var image = e.UserState as IplImage; if (image == null) return; Cv.Not(image, image); _pictureBoxIpl1.RefreshIplImage(image); } private void workerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { _worker.Dispose(); _worker = null; BtnStart.Enabled = true; }
private void BtnStop_Click(object sender, System.EventArgs e) { if (_worker != null) { _worker.CancelAsync(); _worker.Dispose(); } BtnStart.Enabled = true; }
static void PassByValueSample() { int a = 1; PassByValue(a); Console.WriteLine($"after the invocation of {nameof(PassByValue)}, {nameof(a)} = {a}"); } static void PassByValue(int x) { x = 2; }
static void PassByReferenceSample() { int a = 1; PassByReference(ref a); Console.WriteLine($"after the invocation of {nameof(PassByReference)}, {nameof(a)} = {a}"); } static void PassByReference(ref int x) { x = 2; }
static void OutSample() { Out(out int a); Console.WriteLine($"after the invocation of {nameof(Out)}, {nameof(a)} = {a}"); } static void Out(out int x) { x = 2; }
if (int.TryParse("42", out var result)) { Console.WriteLine($"the result is {result}"); }
int x = 3; ref int x1 = ref x; x1 = 2; Console.WriteLine($"local variable {nameof(x)} after the change: {x}");
ref int i = sequence.Count();
ref int number1 = null; // ERROR ref int number2 = 42; // ERROR
static ref int ReturnByReference() { int[] arr = { 1 }; ref int x = ref arr[0]; return ref x; }
static ref int ReturnByReference2() { int[] arr = { 1 }; return ref arr[0]; }
static ref int ReturnByReference3(ref int x) { x = 2; return ref x; }
class Thing1 { ref string _Text1; /* Error */ ref string Text2 { get; set; } /* Error */ string _text = "Text"; ref string Text3 { get { return ref _text; } } // Properties that return a reference are allowed }
private MyBigStruct[] array = new MyBigStruct[10]; private int current; public ref MyBigStruct GetCurrentItem() { return ref array[current]; }
public class NestedClass { private int _field2; public NestedClass() { _field2 = 12; } } public class MyClass { private int _field1; private NestedClass _nestedClass; public MyClass() { _field1 = 1; _nestedClass = new NestedClass(); } private string GetData() { return "Test"; } }
var myClass = new MyClass(); var field1Obj = myClass.GetType().GetField("_field1", BindingFlags.NonPublic | BindingFlags.Instance); if (field1Obj != null) { Console.WriteLine(Convert.ToInt32(field1Obj.GetValue(myClass))); }
var getDataMethod = myClass.GetType().GetMethod("GetData", BindingFlags.NonPublic | BindingFlags.Instance); if (getDataMethod != null) { Console.WriteLine(getDataMethod.Invoke(myClass, null)); }
var nestedClassObj = myClass.GetType().GetField("_nestedClass", BindingFlags.NonPublic | BindingFlags.Instance); if (nestedClassObj != null) { var nestedClassFieldValue = nestedClassObj.GetValue(myClass); var field2Obj = nestedClassFieldValue.GetType() .GetField("_field2", BindingFlags.NonPublic | BindingFlags.Instance); if (field2Obj != null) { Console.WriteLine(Convert.ToInt32(field2Obj.GetValue(nestedClassFieldValue))); } }
myClass._field1 myClass._nestedClass._field2 myClass.GetData()
// Accessing a private field dynamic myClassProxy = new DynamicProxy(myClass); dynamic field1 = myClassProxy._field1; Console.WriteLine((int)field1); // Accessing a nested private field dynamic field2 = myClassProxy._nestedClass._field2; Console.WriteLine((int)field2); // Accessing a private method dynamic data = myClassProxy.GetData(); Console.WriteLine((string)data);
var ws = MSBuildWorkspace.Create(); var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result; // Print the root of the solution. Console.WriteLine(Path.GetFileName(sln.FilePath)); // Get dependency graph to perform a sort. var g = sln.GetProjectDependencyGraph(); var ps = g.GetTopologicallySortedProjects(); // Print all projects, their documents, and references. foreach (var p in ps) { var proj = sln.GetProject(p); Console.WriteLine("> " + proj.Name); Console.WriteLine(" > References"); foreach (var r in proj.ProjectReferences) { Console.WriteLine(" - " + sln.GetProject(r.ProjectId).Name); } foreach (var d in proj.Documents) { Console.WriteLine(" - " + d.Name); } }
Roslyn.sln > Roslyn01 > References - Program.cs - AssemblyInfo.cs - .NETFramework,Version=v4.6.AssemblyAttributes.cs
var ws = MSBuildWorkspace.Create(); var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result; // Get the Tests\Bar.cs document. var proj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests"); var test = proj.Documents.Single(d => d.Name == "Bar.cs"); var tree = test.GetSyntaxTreeAsync().Result; var root = tree.GetRootAsync().Result; // Get all the spans in the document that are classified as language elements. var spans = Classifier.GetClassifiedSpansAsync(test, root.FullSpan).Result.ToDictionary(c => c.TextSpan.Start, c => c); // Print the source text with appropriate colorization. var txt = tree.GetText().ToString(); var i = 0; foreach (var c in txt) { var span = default(ClassifiedSpan); if (spans.TryGetValue(i, out span)) { var color = ConsoleColor.Gray; switch (span.ClassificationType) { case ClassificationTypeNames.Keyword: color = ConsoleColor.Cyan; break; case ClassificationTypeNames.StringLiteral: case ClassificationTypeNames.VerbatimStringLiteral: color = ConsoleColor.Red; break; case ClassificationTypeNames.Comment: color = ConsoleColor.Green; break; case ClassificationTypeNames.ClassName: case ClassificationTypeNames.InterfaceName: case ClassificationTypeNames.StructName: case ClassificationTypeNames.EnumName: case ClassificationTypeNames.TypeParameterName: case ClassificationTypeNames.DelegateName: color = ConsoleColor.Yellow; break; case ClassificationTypeNames.Identifier: color = ConsoleColor.DarkGray; break; } Console.ForegroundColor = color; } Console.Write(c); i++; }
var ws = MSBuildWorkspace.Create(); var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result; // Get the Tests\Qux.cs document. var proj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests"); var qux = proj.Documents.Single(d => d.Name == "Qux.cs"); Console.WriteLine("Before:"); Console.WriteLine(); Console.WriteLine(qux.GetSyntaxTreeAsync().Result.GetText()); Console.WriteLine(); Console.WriteLine(); // Apply formatting and print the result. var res = Formatter.FormatAsync(qux).Result; Console.WriteLine("After:"); Console.WriteLine(); Console.WriteLine(res.GetSyntaxTreeAsync().Result.GetText()); Console.WriteLine();
Before: using System; namespace Roslyn04.Tests { class Qux { public void Baz() { Console.WriteLine(42); return; } } } After: using System; namespace Roslyn04.Tests { class Qux { public void Baz() { Console.WriteLine(42); return; } } }
var ws = MSBuildWorkspace.Create(); var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result; // Get the Tests project. var proj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests"); // Locate the symbol for the Bar.Foo method and the Bar.Qux property. var comp = proj.GetCompilationAsync().Result; var barType = comp.GetTypeByMetadataName("Roslyn04.Tests.Bar"); var fooMethod = barType.GetMembers().Single(m => m.Name == "Foo"); var quxProp = barType.GetMembers().Single(m => m.Name == "Qux"); // Find callers across the solution. Console.WriteLine("Find callers of Foo"); Console.WriteLine(); var callers = SymbolFinder.FindCallersAsync(fooMethod, sln).Result; foreach (var caller in callers) { Console.WriteLine(caller.CallingSymbol); foreach (var location in caller.Locations) { Console.WriteLine(" " + location); } } Console.WriteLine(); Console.WriteLine(); // Find all references across the solution. Console.WriteLine("Find all references to Qux"); Console.WriteLine(); var references = SymbolFinder.FindReferencesAsync(quxProp, sln).Result; foreach (var reference in references) { Console.WriteLine(reference.Definition); foreach (var location in reference.Locations) { Console.WriteLine(" " + location.Location); } }
var ws = MSBuildWorkspace.Create(); var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result; // Get the Tests\Foo.cs document. var proj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests"); var foo = proj.Documents.Single(d => d.Name == "Foo.cs"); // Find the 'dot' token in the first Console.WriteLine member access expression. var tree = foo.GetSyntaxTreeAsync().Result; var model = proj.GetCompilationAsync().Result.GetSemanticModel(tree); var consoleDot = tree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().First().OperatorToken; // Get recommendations at the indicated cursor position. // // Console.WriteLine // ^ var res = Recommender.GetRecommendedSymbolsAtPosition( model, consoleDot.GetLocation().SourceSpan.Start + 1, ws).ToList(); foreach (var rec in res) { Console.WriteLine(rec); }
System.Console.Beep() System.Console.Beep(int, int) System.Console.Clear()
var ws = MSBuildWorkspace.Create(); var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result; // Get Tests\Bar.cs before making changes. var oldProj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests"); var oldDoc = oldProj.Documents.Single(d => d.Name == "Bar.cs"); Console.WriteLine("Before:"); Console.WriteLine(); var oldTxt = oldDoc.GetTextAsync().Result; Console.WriteLine(oldTxt); Console.WriteLine(); Console.WriteLine(); // Get the symbol for the Bar.Foo method. var comp = oldProj.GetCompilationAsync().Result; var barType = comp.GetTypeByMetadataName("Roslyn04.Tests.Bar"); var fooMethod = barType.GetMembers().Single(m => m.Name == "Foo"); // Perform the rename. var newSln = Renamer.RenameSymbolAsync(sln, fooMethod, "Foo2", ws.Options).Result; // Get Tests\Bar.cs after making changes. var newProj = newSln.Projects.Single(p => p.Name == "Roslyn04.Tests"); var newDoc = newProj.Documents.Single(d => d.Name == "Bar.cs"); Console.WriteLine("After:"); Console.WriteLine(); var newTxt = newDoc.GetTextAsync().Result; Console.WriteLine(newTxt);
var ws = MSBuildWorkspace.Create(); var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result; // Get the Tests\Baz.cs document. var proj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests"); var baz = proj.Documents.Single(d => d.Name == "Baz.cs"); Console.WriteLine("Before:"); Console.WriteLine(); Console.WriteLine(baz.GetSyntaxTreeAsync().Result.GetText()); Console.WriteLine(); Console.WriteLine(); var oldRoot = baz.GetSyntaxRootAsync().Result; var memberAccesses = oldRoot.DescendantNodes().OfType<CastExpressionSyntax>(); var newRoot = oldRoot.ReplaceNodes(memberAccesses, (_, m) => m.WithAdditionalAnnotations(Simplifier.Annotation)); var newDoc = baz.WithSyntaxRoot(newRoot); // Invoke the simplifier and print the result. var res = Simplifier.ReduceAsync(newDoc).Result; Console.WriteLine("After:"); Console.WriteLine(); Console.WriteLine(res.GetSyntaxTreeAsync().Result.GetText()); Console.WriteLine();
This command allows cleaning up project and assembly references that have no actual usages in source code. You can apply this command on a project, solution folder, or the entire solution. Before deletion is complete, you will be able to see all references that are going to be removed and. if necessary, preserve the ones that you want to keep.
- Added `jqGrid to PDF Report` Sample. - Improved speed of the aggregate functions. - Removed the obsolete HTML Worker classes. - Added NuGet package references instead of local asm references. - Added a new sample to demonstrate how to convert PDF files to images, using Win8.1 API in desktop applications. - Added a new sample to demonstrate how to view PDF files, using Win8.1 API in desktop applications.
public class Student { public string FirstName; public string LastName; public int TotalPointsEarned; public void TakeExam(int pointsForExam) { TotalPointsEarned += pointsForExam; } public void ExtraCredit(int extraPoints) { TotalPointsEarned += extraPoints; } public int PointsEarned { get { return TotalPointsEarned; } } }
using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace CodingStandards { [DiagnosticAnalyzer(LanguageNames.CSharp)] public class CodingStandardsAnalyzer : DiagnosticAnalyzer { public const string DiagnosticId = "CodingStandards"; // You can change these strings in the Resources.resx file. If you do not want your analyzer to be localize-able, you can use regular strings for Title and MessageFormat. internal static readonly LocalizableString Title = new LocalizableResourceString(nameof(Resources.AnalyzerTitle), Resources.ResourceManager, typeof(Resources)); internal static readonly LocalizableString MessageFormat = new LocalizableResourceString(nameof(Resources.AnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources)); internal static readonly LocalizableString Description = new LocalizableResourceString(nameof(Resources.AnalyzerDescription), Resources.ResourceManager, typeof(Resources)); internal const string Category = "Naming"; internal static DiagnosticDescriptor Rule = new DiagnosticDescriptor( DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Error, isEnabledByDefault: true, description: Description); public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } } public override void Initialize(AnalysisContext context) { // TODO: Consider registering other actions that act on syntax instead of or in addition to symbols context.RegisterSyntaxNodeAction(analyzeFieldDeclaration, SyntaxKind.FieldDeclaration); } static void analyzeFieldDeclaration(SyntaxNodeAnalysisContext context) { var fieldDeclaration = context.Node as FieldDeclarationSyntax; if (fieldDeclaration == null) return; var accessToken = fieldDeclaration .ChildTokens() .SingleOrDefault(token => token.Kind() == SyntaxKind.PublicKeyword); // Note: Not finding protected or internal if (accessToken.Kind() != SyntaxKind.None) { // Find the name of the field: var name = fieldDeclaration.DescendantTokens() .SingleOrDefault(token => token.IsKind(SyntaxKind.IdentifierToken)).Value; var diagnostic = Diagnostic.Create(Rule, fieldDeclaration.GetLocation(), name, accessToken.Value); context.ReportDiagnostic(diagnostic); } } } }
using System.Collections.Immutable; using System.Composition; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace CodingStandards { [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(CodingStandardsCodeFixProvider)), Shared] public class CodingStandardsCodeFixProvider : CodeFixProvider { public sealed override ImmutableArray<string> FixableDiagnosticIds { get { return ImmutableArray.Create(CodingStandardsAnalyzer.DiagnosticId); } } public sealed override FixAllProvider GetFixAllProvider() { return WellKnownFixAllProviders.BatchFixer; } public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); // TODO: Replace the following code with your own analysis, generating a CodeAction for each fix to suggest var diagnostic = context.Diagnostics.First(); var diagnosticSpan = diagnostic.Location.SourceSpan; // Find the type declaration identified by the diagnostic. var declaration = root.FindToken(diagnosticSpan.Start) .Parent.AncestorsAndSelf().OfType<FieldDeclarationSyntax>() .First(); // Register a code action that will invoke the fix. context.RegisterCodeFix( CodeAction.Create("Make Private", c => makePrivateDeclarationAsync(context.Document, declaration, c)), diagnostic); } async Task<Document> makePrivateDeclarationAsync(Document document, FieldDeclarationSyntax declaration, CancellationToken c) { var accessToken = declaration.ChildTokens() .SingleOrDefault(token => token.Kind() == SyntaxKind.PublicKeyword); var privateAccessToken = SyntaxFactory.Token(SyntaxKind.PrivateKeyword); var root = await document.GetSyntaxRootAsync(c); var newRoot = root.ReplaceToken(accessToken, privateAccessToken); return document.WithSyntaxRoot(newRoot); } } }
steps: - name: Dump GitHub Context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT"
GITHUB_CONTEXT: { "token": "***", "ref": "refs/heads/master", "sha": "3251394ad66ae8419e606fbf78570906ff2f01d3", "repository": "mjebrahimi/github_actions_test", "repositoryUrl": "git://github.com/mjebrahimi/github_actions_test.git", "run_id": "66966756", "run_number": "17", "actor": "mjebrahimi", "workflow": ".NET Core", "head_ref": "", "base_ref": "", "event_name": "push", "event": { "after": "3251394ad66ae8419e606fbf78570906ff2f01d3", "base_ref": null, "before": "b6c382e8fe74916daf6821a5a71efe480bd98a13", "commits": [ { "author": { "email": "mj.ebrahimi72@gmail.com", "name": "Mohammad Javad Ebrahimi", "username": "mjebrahimi" }, "committer": { "email": "noreply@github.com", "name": "GitHub", "username": "web-flow" }, "distinct": true, "id": "3251394ad66ae8419e606fbf78570906ff2f01d3", "message": "Update dotnetcore.yml", "timestamp": "2020-03-31T04:48:53+04:30", "tree_id": "e27a05129010b3b2a7b18b92d91cd73a32babb8f", "url": "https://github.com/mjebrahimi/github_actions_test/commit/3251394ad66ae8419e606fbf78570906ff2f01d3" } ], "compare": "https://github.com/mjebrahimi/github_actions_test/compare/b6c382e8fe74...3251394ad66a", "created": false, "deleted": false, "forced": false, "head_commit": { "author": { "email": "mj.ebrahimi72@gmail.com", "name": "Mohammad Javad Ebrahimi", "username": "mjebrahimi" }, "committer": { "email": "noreply@github.com", "name": "GitHub", "username": "web-flow" }, "distinct": true, "id": "3251394ad66ae8419e606fbf78570906ff2f01d3", "message": "Update dotnetcore.yml", "timestamp": "2020-03-31T04:48:53+04:30", "tree_id": "e27a05129010b3b2a7b18b92d91cd73a32babb8f", "url": "https://github.com/mjebrahimi/github_actions_test/commit/3251394ad66ae8419e606fbf78570906ff2f01d3" }, "pusher": { "email": "mj.ebrahimi72@gmail.com", "name": "mjebrahimi" }, "ref": "refs/heads/master", "repository": { "archive_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/{archive_format}{/ref}", "archived": false, "assignees_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/assignees{/user}", "blobs_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/git/blobs{/sha}", "branches_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/branches{/branch}", "clone_url": "https://github.com/mjebrahimi/github_actions_test.git", "collaborators_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/collaborators{/collaborator}", "comments_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/comments{/number}", "commits_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/commits{/sha}", "compare_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/compare/{base}...{head}", "contents_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/contents/{+path}", "contributors_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/contributors", "created_at": 1585584602, "default_branch": "master", "deployments_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/deployments", "description": null, "disabled": false, "downloads_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/downloads", "events_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/events", "fork": false, "forks": 0, "forks_count": 0, "forks_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/forks", "full_name": "mjebrahimi/github_actions_test", "git_commits_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/git/commits{/sha}", "git_refs_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/git/refs{/sha}", "git_tags_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/git/tags{/sha}", "git_url": "git://github.com/mjebrahimi/github_actions_test.git", "has_downloads": true, "has_issues": true, "has_pages": false, "has_projects": true, "has_wiki": true, "homepage": null, "hooks_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/hooks", "html_url": "https://github.com/mjebrahimi/github_actions_test", "id": 251358686, "issue_comment_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/issues/comments{/number}", "issue_events_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/issues/events{/number}", "issues_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/issues{/number}", "keys_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/keys{/key_id}", "labels_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/labels{/name}", "language": "C#", "languages_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/languages", "license": null, "master_branch": "master", "merges_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/merges", "milestones_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/milestones{/number}", "mirror_url": null, "name": "github_actions_test", "node_id": "MDEwOlJlcG9zaXRvcnkyNTEzNTg2ODY=", "notifications_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/notifications{?since,all,participating}", "open_issues": 0, "open_issues_count": 0, "owner": { "avatar_url": "https://avatars1.githubusercontent.com/u/23256135?v=4", "email": "mj.ebrahimi72@gmail.com", "events_url": "https://api.github.com/users/mjebrahimi/events{/privacy}", "followers_url": "https://api.github.com/users/mjebrahimi/followers", "following_url": "https://api.github.com/users/mjebrahimi/following{/other_user}", "gists_url": "https://api.github.com/users/mjebrahimi/gists{/gist_id}", "gravatar_id": "", "html_url": "https://github.com/mjebrahimi", "id": 23256135, "login": "mjebrahimi", "name": "mjebrahimi", "node_id": "MDQ6VXNlcjIzMjU2MTM1", "organizations_url": "https://api.github.com/users/mjebrahimi/orgs", "received_events_url": "https://api.github.com/users/mjebrahimi/received_events", "repos_url": "https://api.github.com/users/mjebrahimi/repos", "site_admin": false, "starred_url": "https://api.github.com/users/mjebrahimi/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mjebrahimi/subscriptions", "type": "User", "url": "https://api.github.com/users/mjebrahimi" }, "private": false, "pulls_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/pulls{/number}", "pushed_at": 1585613933, "releases_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/releases{/id}", "size": 40, "ssh_url": "git@github.com:mjebrahimi/github_actions_test.git", "stargazers": 0, "stargazers_count": 0, "stargazers_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/stargazers", "statuses_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/statuses/{sha}", "subscribers_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/subscribers", "subscription_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/subscription", "svn_url": "https://github.com/mjebrahimi/github_actions_test", "tags_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/tags", "teams_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/teams", "trees_url": "https://api.github.com/repos/mjebrahimi/github_actions_test/git/trees{/sha}", "updated_at": "2020-03-31T00:01:15Z", "url": "https://github.com/mjebrahimi/github_actions_test", "watchers": 0, "watchers_count": 0 }, "sender": { "avatar_url": "https://avatars1.githubusercontent.com/u/23256135?v=4", "events_url": "https://api.github.com/users/mjebrahimi/events{/privacy}", "followers_url": "https://api.github.com/users/mjebrahimi/followers", "following_url": "https://api.github.com/users/mjebrahimi/following{/other_user}", "gists_url": "https://api.github.com/users/mjebrahimi/gists{/gist_id}", "gravatar_id": "", "html_url": "https://github.com/mjebrahimi", "id": 23256135, "login": "mjebrahimi", "node_id": "MDQ6VXNlcjIzMjU2MTM1", "organizations_url": "https://api.github.com/users/mjebrahimi/orgs", "received_events_url": "https://api.github.com/users/mjebrahimi/received_events", "repos_url": "https://api.github.com/users/mjebrahimi/repos", "site_admin": false, "starred_url": "https://api.github.com/users/mjebrahimi/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mjebrahimi/subscriptions", "type": "User", "url": "https://api.github.com/users/mjebrahimi" } }, "workspace": "/home/runner/work/github_actions_test/github_actions_test", "action": "run1" }
jobs: build: if: contains(toJson(github.event.commits), '[SKIP CI]') == false runs-on: ubuntu-latest ...
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)] public class SanitizeInputAttribute : ActionFilterAttribute { var sanitizer = new Ganss.XSS.HtmlSanitizer(); public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.ActionArguments != null) { foreach (var parameter in filterContext.ActionArguments) { var properties = parameter.Value.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public) .Where(x => x.CanRead && x.CanWrite && x.PropertyType == typeof(string) && x.GetGetMethod(true).IsPublic && x.GetSetMethod(true).IsPublic); foreach (var propertyInfo in properties) { if (propertyInfo.GetValue(parameter.Value) != null) propertyInfo.SetValue(parameter.Value, sanitizer.Sanitize(propertyInfo.GetValue(parameter.Value).ToString())); } } } } }
[SanitizeInput] public IActionResult Add(GroupDto dto)