C# 动态输入

19 篇文章 0 订阅
11 篇文章 0 订阅

C# 动态输入,在输入时你也可以访问你写入的内容)

注意,这里是在我刚学C#时写的,但我不想删除任何我的足迹.
这个类库不是完善的,如果需要完整功能(真的很好用),请去我的新文章: [C#] 控制台动态输入 - 增强版ReadLine()

代码:

主要就是能够实现在输入的同时,子线程可以通过该实例的Text属性来访问已经输入了的内容,别的倒也懒得实现了awa

刚学不久,不喜勿喷

//其实代码不怎么好,做做参考就可以了,注意:没有普通Console.ReadLine()的上下键功能

    class DynamicInput
    {
        class CharInfo
        {
            public CharInfo(int position,char chr)
            {
                this.position = position;
                this.chr = chr;
            }
            int position;
            char chr;
            public int Position
            {
                get
                {
                    return position;
                }
            }
            public char Char
            {
                get
                {
                    return chr;
                }
            }
        }

        delegate void Add_historyEventHandler(object sender,EventArgs e);

        private int default_left;
        private string text = "";
        private List<string> input_history = new List<string>();
        private List<CharInfo> input_list = new List<CharInfo>();

        public string Text
        {
            get
            {
                return text;
            }
        }
        public string Start()
        {
            default_left = Console.CursorLeft;
            ConsoleKeyInfo key;
            while (true)
            {
                key = Console.ReadKey();
                if (key.Key.Equals(ConsoleKey.Enter))
                {
                    return text;
                }        //回车确认
                if (key.Key.Equals(ConsoleKey.Backspace))
                {
                    Console.Write(" ");
                    if (Console.CursorLeft > input_list.Count)
                    {
                        if (input_list.Count >1 )
                        {
                            for (int i = 0; i <= Console.CursorLeft - input_list[input_list.Count-2].Position; i ++)
                            {
                                Console.Write("\b \b");
                            }
                        }
                        else
                        {
                            for (int i = 0; i <= Console.CursorLeft - default_left; i++)
                            {
                                Console.Write("\b \b");
                            }
                        }
                    }
                    else
                    {
                        if (input_list.Count > 1)
                        {
                            for (int i = 0; i <= Console.CursorLeft + Console.WindowLeft - input_list[input_list.Count - 2].Position; i++)
                            {
                                Console.Write("\b \b");
                            }
                        }
                        else
                        {
                            for (int i = 0; i <= Console.CursorLeft + Console.WindowLeft - default_left; i++)
                            {
                                Console.Write("\b \b");
                            }
                        }
                    }
                    if(input_list.Count > 0)
                    {
                        text = text.Substring(0, text.Length - 1);
                        input_list.RemoveAt(input_list.Count - 1);
                    }
                    continue;
                }    //BackSpace退格
                if (!key.Key.Equals(ConsoleKey.Spacebar) & (key.KeyChar == ' '|key.KeyChar == '\0'))
                {
                    Console.Write("\b");
                    continue;
                }
                text += key.KeyChar;                            //更新Text
                input_list.Add(new CharInfo(Console.CursorLeft, key.KeyChar));   //记录字符与位置
            }
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 动态编译可以让我们在运行时动态地编译代码并生成可执行程序集。这在某些情况下非常有用,例如在我们需要根据用户输入来生成代码的情况下。 以下是一个简单的示例,演示了如何使用 C# 动态编译: ```csharp using System; using System.CodeDom.Compiler; using System.Reflection; using Microsoft.CSharp; class Program { static void Main() { // 定义代码片段 string code = @" using System; namespace MyNamespace { public class MyClass { public static void SayHello() { Console.WriteLine(""Hello, World!""); } } }"; // 编译代码 CSharpCodeProvider provider = new CSharpCodeProvider(); CompilerParameters parameters = new CompilerParameters(); parameters.GenerateInMemory = true; CompilerResults results = provider.CompileAssemblyFromSource(parameters, code); // 检查是否有编译错误 if (results.Errors.HasErrors) { Console.WriteLine("编译错误:"); foreach (CompilerError error in results.Errors) { Console.WriteLine(error.ErrorText); } return; } // 从程序集中获取类和方法 Assembly assembly = results.CompiledAssembly; Type type = assembly.GetType("MyNamespace.MyClass"); MethodInfo method = type.GetMethod("SayHello"); // 调用方法 method.Invoke(null, null); } } ``` 该示例中,我们首先定义了一个字符串变量 `code`,其中包含要编译的代码片段。然后使用 `CSharpCodeProvider` 类创建一个编译器实例,并使用 `CompileAssemblyFromSource` 方法将代码编译成程序集。我们还需要指定 `CompilerParameters`,其中包括一些编译选项,例如是否将程序集生成到内存中。 如果编译成功,则可以通过程序集中的 `GetType` 方法获取类的类型,并使用 `GetMethod` 方法获取类中的方法。最后,使用 `Invoke` 方法调用该方法,并在控制台输出 "Hello, World!"。 需要注意的是,动态编译可能存在安全性问题,因为用户可以利用它来注入恶意代码。因此,在使用动态编译时,需要进行严格的输入验证和安全性检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值