先宣告本人初學C#,對于有些問題點實在是不太明白,之前從網上下載的一個dll檔案,現在需要呼叫的是下面這個類。
namespace DotNet.Utilities
{
public class EcanConvertToCh
{
public string convertCh(string Chstr)
{
Regex reg = new Regex("^[\u4e00-\u9fa5]$");//驗證是否輸入漢字
byte[] arr = new byte[2];
string pystr = "";
int asc = 0, M1 = 0, M2 = 0;
char[] mChar = Chstr.ToCharArray();//獲取漢字對應的字符陣列
for (int j = 0; j < mChar.Length; j++)
{
//如果輸入的是漢字
if (reg.IsMatch(mChar[j].ToString()))
{
arr = System.Text.Encoding.Default.GetBytes(mChar[j].ToString());
M1 = (short)(arr[0]);
M2 = (short)(arr[1]);
asc = M1 * 256 + M2 - 65536;
if (asc > 0 && asc < 160)
{
pystr += mChar[j];
}
else
{
switch (asc)
{
case -9254:
pystr += "Zhen"; break;
case -8985:
pystr += "Qian"; break;
case -5463:
pystr += "Jia"; break;
case -8274:
pystr += "Ge"; break;
case -5448:
pystr += "Ga"; break;
case -5447:
pystr += "La"; break;
case -4649:
pystr += "Chen"; break;
case -5436:
pystr += "Mao"; break;
case -5213:
pystr += "Mao"; break;
case -3597:
pystr += "Die"; break;
case -5659:
pystr += "Tian"; break;
default:
for (int i = (getValue.Length - 1); i >= 0; i--)
{
if (getValue[i] <= asc) //判斷漢字的拼音區編碼是否在指定范圍內
{
pystr += getName[i];//如果不超出范圍則獲取對應的拼音
break;
}
}
break;
}
}
}
else//如果不是漢字
{
pystr += mChar[j].ToString();//如果不是漢字則回傳
}
}
return pystr;//回傳獲取到的漢字拼音
}
}
}
其中convertCh 方法是非靜態,按常理應該在呼叫的時候需要被實體化才行,但是嘗試過很多次,都不知道該怎么去實體化:下面的代碼是針對靜態函式的操作,請求針對非靜態的話應該怎么呼叫,怎么實體化?
namespace relective
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string dllName = "DotNet.Utilities"; //指定Dll檔案的檔案名
string fullName = "DotNet.Utilities.EcanConvertToCh";
Assembly Dll = Assembly.Load(dllName); //利用反射函式加載Dll檔案
Type type = Dll.GetType(fullName); //加載Dll檔案里的檔案物件型別
var dll = Activator.CreateInstance(type); //創建建構式
string pinyin = type.InvokeMember("convertCh", BindingFlags.InvokeMethod | BindingFlags.Public, null, null, new object[] { textBox1.Text.Trim() }).ToString();
MessageBox.Show(pinyin);
}
}
uj5u.com熱心網友回復:
string dllName = "DotNet.Utilities"; //指定Dll檔案的檔案名
string fullName = "DotNet.Utilities.EcanConvertToCh";
Assembly Dll = Assembly.Load(dllName); //利用反射函式加載Dll檔案
Type type = Dll.GetType(fullName); //加載Dll檔案里的檔案物件型別
var dll = Activator.CreateInstance(type); //創建建構式
MethodInfo convertCh = type.GetMethod("convertCh");
string pinyin = convertCh.Invoke(dll, new object[] {textBox1.Text.Trim()}).ToString();
uj5u.com熱心網友回復:
你直接把他改成靜態方法不就成了,這個方法完全沒必要設定為非靜態的如果你還是想用非靜態的方法呼叫,那么需要實體化這個方法所在類的實體
然后再用反射區呼叫這個方法
type.InvokeMember("convertCh", BindingFlags.InvokeMethod | BindingFlags.Public, null, dll, new object[] { textBox1.Text.Trim() }).ToString();
注意是把第二個null改成dll,意思是在dll物件上呼叫其方法
uj5u.com熱心網友回復:
謝謝,因為是初學,所以對這些方法不是很熟悉,所以靜態和非靜態都嘗試著使用,來加深印象, 我按照你的方法來操作,直接將null替換為dll的話,會報錯誤:MissingMethod_Name, 1樓的方法沒有問題,可以正常操作。
uj5u.com熱心網友回復:
謝謝,按照你的方法可以實作實體化并呼叫相應的方法了。
uj5u.com熱心網友回復:
不客氣,不知道你為何要這樣呼叫呢~
uj5u.com熱心網友回復:
其實也沒有什么特殊意義,只是我用來學習的,所以想嘗試不同的實作方式
uj5u.com熱心網友回復:
其實也沒有什么特殊意義,只是我用來學習的,所以想嘗試不同的實作方式
嗯,首先要將名詞改過來,不能叫函式, 要叫方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/146910.html
標籤:C#
