Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
NLua
Commits
ded4dc5c
Unverified
Commit
ded4dc5c
authored
Jan 29, 2024
by
yuwei
Committed by
GitHub
Jan 28, 2024
Browse files
Added support for generic class parameters for generic methods (#505)
parent
50a963dc
Changes
4
Hide whitespace changes
Inline
Side-by-side
src/CheckType.cs
View file @
ded4dc5c
...
...
@@ -117,6 +117,14 @@ namespace NLua
if
(
luatype
==
LuaType
.
Number
)
return
_extractValues
[
typeof
(
double
)];
}
//Added support for generic type
if
(
paramType
.
IsGenericType
)
{
if
(
luatype
==
LuaType
.
UserData
)
return
_extractValues
[
typeof
(
object
)];
}
bool
netParamIsString
=
paramType
==
typeof
(
string
)
||
paramType
==
typeof
(
char
[])
||
paramType
==
typeof
(
byte
[]);
if
(
netParamIsNumeric
)
...
...
src/Method/LuaMethodWrapper.cs
View file @
ded4dc5c
...
...
@@ -275,20 +275,46 @@ namespace NLua.Method
int
CallInvokeOnGenericMethod
(
LuaState
luaState
,
MethodInfo
methodToCall
,
object
targetObject
)
{
//need to make a concrete type of the generic method definition
var
typeArgs
=
new
List
<
Type
>();
ParameterInfo
[]
parameters
=
methodToCall
.
GetParameters
();
Dictionary
<
string
,
Type
>
genericParameterNames
=
new
Dictionary
<
string
,
Type
>();
ParameterInfo
[]
parameters
=
methodToCall
.
GetParameters
();
for
(
int
i
=
0
;
i
<
parameters
.
Length
;
i
++)
{
ParameterInfo
parameter
=
parameters
[
i
];
if
(!
parameter
.
ParameterType
.
IsGenericParameter
)
continue
;
if
(
parameter
.
ParameterType
.
IsGenericType
)
{
var
currentArg
=
_lastCalledMethod
.
args
[
i
];
var
currentArgType
=
currentArg
.
GetType
();
var
genericArgTypeArguments
=
currentArgType
.
GenericTypeArguments
;
//if currentArgType is array, use element type to be generic arguments for compatibility IEnumerable.
if
(
currentArgType
.
IsArray
)
{
genericArgTypeArguments
=
new
Type
[]
{
currentArgType
.
GetElementType
()
};
}
var
genericTypeArguments
=
parameter
.
ParameterType
.
GenericTypeArguments
;
for
(
int
j
=
0
;
j
<
genericTypeArguments
.
Length
;
j
++)
{
var
arg
=
genericTypeArguments
[
j
];
if
(
arg
.
IsGenericParameter
&&
!
genericParameterNames
.
ContainsKey
(
arg
.
Name
))
{
genericParameterNames
.
Add
(
arg
.
Name
,
genericArgTypeArguments
[
j
]);
}
}
}
typeArgs
.
Add
(
_lastCalledMethod
.
args
[
i
].
GetType
());
if
(
parameter
.
ParameterType
.
IsGenericParameter
)
{
genericParameterNames
.
Add
(
parameter
.
ParameterType
.
Name
,
_lastCalledMethod
.
args
[
i
].
GetType
());
}
}
//Map Name/Type to generic arguments types
var
methodGenericArguments
=
methodToCall
.
GetGenericArguments
();
var
typeArgs
=
methodGenericArguments
.
Select
(
item
=>
genericParameterNames
[
item
.
Name
]);
MethodInfo
concreteMethod
=
methodToCall
.
MakeGenericMethod
(
typeArgs
.
ToArray
());
var
result
=
concreteMethod
.
Invoke
(
targetObject
,
_lastCalledMethod
.
args
);
...
...
tests/src/LuaTests.cs
View file @
ded4dc5c
...
...
@@ -492,6 +492,22 @@ namespace NLuaTest
Assert
.
AreEqual
(
true
,
classWithGenericMethod
.
GenericMethodSuccess
);
Assert
.
AreEqual
(
56
,
(
classWithGenericMethod
.
PassedValue
as
TestTypes
.
TestClass
).
val
);
lua
.
RegisterFunction
(
"genericMethod3"
,
classWithGenericMethod
,
typeof
(
TestClassWithGenericMethod
).
GetMethod
(
"GenericMethodWithGenericTypes"
));
try
{
lua
[
"ts"
]
=
new
string
[]
{
"aaa"
,
"bbb"
,
"ccc"
};
lua
[
"dic"
]
=
new
Dictionary
<
string
,
int
>
{
{
"ddd"
,
111
},
{
"eee"
,
222
},
{
"fff"
,
333
}
};
lua
.
DoString
(
"genericMethod3(ts, dic)"
);
}
catch
{
}
Assert
.
AreEqual
(
true
,
classWithGenericMethod
.
GenericMethodSuccess
);
Assert
.
AreEqual
(
true
,
classWithGenericMethod
.
Validate
<
int
>(
6
));
}
}
...
...
tests/src/TestTypes/TestClassWithGenericMethod.cs
View file @
ded4dc5c
namespace
NLuaTest.TestTypes
using
System.Collections.Generic
;
using
System.Linq
;
namespace
NLuaTest.TestTypes
{
/// <summary>
/// Normal class containing a generic method
...
...
@@ -35,9 +38,15 @@
_GenericMethodSuccess
=
true
;
}
public
void
GenericMethodWithGenericTypes
<
T
,
T1
>(
IEnumerable
<
T
>
ts
,
Dictionary
<
T
,
T1
>
dic
)
{
_PassedValue
=
dic
.
Count
()
+
ts
.
Count
();
_GenericMethodSuccess
=
true
;
}
internal
bool
Validate
<
T
>(
T
value
)
{
return
value
.
Equals
(
_PassedValue
);
}
}
}
\ No newline at end of file
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment